4.熟悉Java基本类库系列——Java 正则表达式类库
正则表达式语法结构图:

Java正则表达式类库结构图:

Java典型例子
1、String类 matches()方法
判断字符串是否符合特定正则表达式
@Test public void testRegex(){
String regex = ".*\\d{3}.*";
String str1 = "11tec34";
String str2 = "285dffd";
String str3 = "bac7736db";
//输出:false, true, true
System.out.println(str1.matches(regex) + "," + str2.matches(regex) + "," + str3.matches(regex));
}
2、String类 split()方法
用正则表达式分割字符串
@Test public void testRegex2(){
String input = "hello3world8my9name1is5jacket";
String regex = "\\d"; //以数字作为分隔符
String strs[] = input.split(regex);
//输出:hello world my name is jacket
for(String str : strs){
System.out.print(str + " ");
}
System.out.println();
input = "hellodogworlddogmydognamedogisdogjacket";
regex = "dog"; //以"dog"字符作为分隔符
strs = input.split(regex);
//输出:hello world my name is jacket
for(String str : strs){
System.out.print(str + " ");
}
}
3、String类 replace()方法
用正则表达式替换字符
@Test public void testRegex3(){
String input = "hello3world8my9name1is5jacket";
String regex = "\\d"; //以数字作为分隔符
String firstStr = input.replaceFirst(regex, ":"); //只替换第一个匹配的字符
String allStr = input.replaceAll(regex, ":"); //替换所有匹配的字符
//输出:
//hello:world8my9name1is5jacket
//hello:world:my:name:is:jacket
System.out.println(firstStr);
System.out.println(allStr);
}
4、Pattern.matches() 静态方法
判断字符串是否符合正则表达式,等同于String类的matches()方法
@Test public void testRegex4(){
String regex1 = "\\bdog\\b";
String regex2 = ".*\\bdog\\b.*";
String input = "dog dog dog doggie dogg";
//输出:false,true
System.out.println(Pattern.matches(regex1, input) + "," + Pattern.matches(regex2, input));
}
5、Pattern类 split()方法
根据正则表达式分割字符串,等同于String类的split()方法
//6.split() 分割字符串 -> 等同于String的split()方法
@Test public void testRegex6(){
String regex = "\\d";
String input = "hello3world5hello8java";
Pattern p = Pattern.compile(regex);
String strs[] = p.split(input);
//输出:hello world hello java
for(String str : strs){
System.out.print(str + " ");
}
}
6、Pattern.quote() 静态方法
获取匹配此字符串的正则表达式
@Test public void testRegex6(){
//例子1
String input = ".";
String regex = Pattern.quote(input);
boolean flag = Pattern.matches(regex, input);
//输出:\Q353434\E true
System.out.println(regex);
System.out.println(flag);
//例子2
input = "test.test";
String errorOutput = input.replaceAll(".", "/");
//输出://///////
System.out.println(errorOutput);
//例子3
String correctOutput = input.replaceAll(Pattern.quote("."), "/");
//输出:test/test
System.out.println(correctOutput);
}
7、Matcher类 find()方法,start()方法,end()方法
@Test public void testRegex7(){
//m.start() m.end()
String regex = "\\bdog\\b";
String input = "dog dog dog doggie dogg";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input); // 获得匹配器对象
int count = 0;
while (m.find()) {
count++;
//Match number 1,start(): 0,end(): 3
//Match number 2,start(): 4,end(): 7
//Match number 3,start(): 8,end(): 11
System.out.print("Match number " + count);
System.out.print(",start(): " + m.start());
System.out.println(",end(): " + m.end());
}
}
8、Matcher类 find(int index)方法,start(int index),end(int index)
@Test public void testRegex8(){
//m.start() m.end()
String regex = "\\bdog\\b";
String input = "dog dog dog doggie dogg";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input); // 获得匹配器对象
//m.find(int start)
//输出:start(): 0,end(): 3
//start(): 4,end(): 7
m.find(0); //从要匹配的字符串的第几个字符开始寻找
System.out.print("start(): " + m.start());
System.out.println("end(): " + m.end());
m.find();
System.out.print("start(): " + m.start());
System.out.println("end(): " + m.end());
//m.find(int start)
//输出:start(): 4,end(): 7
//start(): 8,end(): 11
m.find(4);
System.out.print("start(): " + m.start());
System.out.println("end(): " + m.end());
m.find();
System.out.print("start(): " + m.start());
System.out.println("end(): " + m.end());
//m.start(int group) m.end(int group)
m.find(0); //
int firstStartGroupIndex = m.start(0);
System.out.println(firstStartGroupIndex);
}
9、Matcher类 lookingAt()方法,matches()方法
判断字符串是否匹配特定的正则表达式,lookingAt()方法不要求全部匹配,而matches()方法要求全部匹配
@Test public void testRegex9(){
String regex = "foo";
String str = "fooooooooooooooooo";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println("Current regex is: " + regex);
System.out.println("Current str is: " + str);
System.out.println("lookingAt(): " + matcher.lookingAt()); //true
System.out.println("matches(): " + matcher.matches()); //false,因为matches要求全部匹配
}
此外还有其他的Matcher类的方法未整理,
//还有Matcher类的其他方法未整理:
//1.group(int group)方法
//2.appendReplacement() / appendTail() / replaceAll() / replaceFirst() / quoteReplacement()
//99.Matcher类的find()方法,start()方法,end()方法
更多详细的正则表达式博文可以参考:
微软官方文档:https://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.80).aspx
一个很好的正则表达式教程:http://www.java3z.com/cwbwebhome/article/article8/Regex/Java.Regex.Tutorial.html#reg7
4.熟悉Java基本类库系列——Java 正则表达式类库的更多相关文章
- Java面试题系列 ----- Java基础面试题(91道)
更多详情点击查看,点这里!这里!!这里!!! 文末获取所有面试PDF文档! Java概述 1. 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 为了 ...
- 2.熟悉Java基本类库系列——Java IO 类库
Java中常用的IO操作基本上可以分为四大部分,分别是:File类操作.RandomAccessFile类操作.字节流操作.字符流操作.只要熟练掌握了本文中所列举的所有例子,基本上对于Java的IO流 ...
- 1.熟悉Java基本类库系列 - 目录
写这个系列是想让自己多熟悉熟悉Java的基本类库,忘记的时候可以在这里看看之前写过的例子,这样就可以很快的回忆起来如何使用了. 这样就可以很节省时间了. ======= 下面是传送门啦 ======= ...
- java高并发系列 - 第14天:JUC中的LockSupport工具类,必备技能
这是java高并发系列第14篇文章. 本文主要内容: 讲解3种让线程等待和唤醒的方法,每种方法配合具体的示例 介绍LockSupport主要用法 对比3种方式,了解他们之间的区别 LockSuppor ...
- java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例
这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...
- java高并发系列 - 第13天:JUC中的Condition对象
本文目标: synchronized中实现线程等待和唤醒 Condition简介及常用方法介绍及相关示例 使用Condition实现生产者消费者 使用Condition实现同步阻塞队列 Object对 ...
- java高并发系列 - 第2天:并发级别
由于临界区的存在,多线程之间的并发必须受到控制.根据控制并发的策略,我们可以把并发的级别分为阻塞.无饥饿.无障碍.无锁.无等待几种. 阻塞 一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继 ...
- java基础解析系列(三)---HashMap
java基础解析系列(三)---HashMap java基础解析系列 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)-- ...
- java高并发系列-第1天:必须知道的几个概念
java高并发系列-第1天:必须知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后, ...
随机推荐
- gridView 单元格绑定不同控件方法
1.主要代码: private void Form3_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Col ...
- 纪中集训 Day 4
今天(其实是昨天)不考试= = 所以就刷题了 = = 早上无所事事,想把几道题刷过却很不爽的全删了 下午觉得不能这样了,把BZOJ 过了两道水的DP (计算几何根本不会啊QAQ) 晚上先水了一题之后, ...
- 对本地Solr服务器添加IK中文分词器实现全文检索功能
在上一篇随笔中我们提到schema.xml中<field/>元素标签的配置,该标签中有四个属性,分别是name.type.indexed与stored,这篇随笔将讲述通过设置type属性的 ...
- 从C#到TypeScript - Reflect
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- 规范 : Sql statusEnum
statusEnum 的诞生是为了在看Sql 表时,可以知道他是一个有特别的string的分类,在扩张或修改时,可以方便追踪到c#, e.g. 如果是“称呼”(column title),在sql没有 ...
- 转:Apache 与 Nginx 比较
Nginx 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apa ...
- Cloud9vue&vux上传github小步骤
成功后创建出以下文件,再输入: git init 再输入:$ git remote add origin https://github.com/github用户名/vux1 然后:git add. 按 ...
- 使用docker-compose 大杀器来部署服务 上
使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...
- 怎么用php语言来做文件缓存
使用缓存能够让我们的程序访问起来更加快速,缓存可以减少对数据库的操作,体验起来更好一些,对服务器的压力也小一些,当然服务速度很快 php文件执行完之后产生的解析完的数据,保存成静态的网页,下次打开的这 ...
- C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
3.空指针(nullptr) 早在 1972 年,C语言诞生的初期,常数0带有常数及空指针的双重身分. C 使用 preprocessor macroNULL 表示空指针, 让 NULL 及 0 分别 ...