最简单的java正则表达式

浅入浅出java正则表达式,用最容易理解的顺序快速理解java正则表达式


文章目录

目录

一、正则的基础使用

二、Pattern 类与 Matcher类

1)为了下边的学习,我们学习几个匹配规则:

三、Matcher提供的方法

1)Matcher查找方法

2)Matcher索引方法

3)捕获组的使用

四、总结



 

一、正则的基础使用

判断一串字符是否全为数字

boolean bool = Pattern.matches("\\d+","1234csdn");
System.out.println(bool);  //输出false ,因为字符1234中包含csdn

第一个参数 "\\d+" 是匹配的规则,第二个参数 "1234csdn"是待匹配的字符串

问题1: 为什么要为 \\d+ 而不是 \d+

         直接点,java插入单斜杠报错,如果要插入一个斜杠需要使用双斜杠的形式。

问题2:\d 的作用

        \d 的作用代表匹配一个数字。如果只是单纯写d,只是匹配字母d,而前边的斜杠赋予了它新的意义(代表一个数字)

       此时输入  \\d java就知道我们要做什么了 \\ 表示我们要输入一个 \ ,\与后边的d 联合起来就表示匹配一个数字

问题3:+的作用

      + 代表匹配一个或多个

       \d只是匹配一个数字,如匹配"1"返回真,而匹配"12"返回假(因为有两个数字了),\d+就代表匹配一个或多个数字

二、Pattern 类与 Matcher类

上边的案例只是表达式的简化版,完整的写法如下,好处是 Matcher提供多个方法,可以实现其实复杂的操作

Pattern p1 = Pattern.compile("\\d+"); //pattern 对象是一个正则表达式的编译表示
Matcher m1 = p1.matcher("1234csdn"); //Matcher 对象是对输入字符串进行解释和匹配操作的引擎
boolean bool1 = m1.matches();
System.out.println("bool1:"+bool1);

可以把Pattern看做一个模板,作用就是存储匹配规则,Matcher看做引擎,通过匹配规则实现多个功能。

1)为了下边的学习,我们学习几个匹配规则:

*

零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。

+

一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。

\d

数字字符匹配。等效于 [0-9]。

\D

非数字字符匹配。等效于 [^0-9]。

.

匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。

三、Matcher提供的方法

1)Matcher查找方法

上边我们使用了 matches() 方法,尝试将整个字符串与规则匹配(整个字符串都必须满足这个规则)。下边看其他常用的匹配模式

1

public boolean lookingAt()

 尝试将从区域开头开始的输入序列与该模式匹配。

2

public boolean find()

尝试查找与该模式匹配的输入序列的下一个子序列。

4

public boolean matches()

尝试将整个区域与模式匹配。

Pattern p1 = Pattern.compile("\\d+");
Matcher m1 = p1.matcher("as1234");
boolean bool1 = m1.matches();
boolean bool2 = m1.find();
boolean bool3 = m1.lookingAt();
System.out.println("bool1:"+bool1); //==> false  因为matches是整个字符串都要符合,可见as并不是数字
System.out.println("bool2:"+bool2); //==> true  find只要某一部分符合就可以,1234是符合条件的
System.out.println("bool3:"+bool3); //==> false  lookingAt()可以看作从开始某一部分符合,开始以a开始,也就不符合条件了

问题一:只要一串字符中存在 子子符串 ‘asd' 返回真

Pattern p1 = Pattern.compile("asd");
 Matcher m1 = p1.matcher("as1asd234");
 boolean bool1 = m1.find();  //==> true 因为只要存在就返回真,刚好可以用 find()

问题二:判断一串字符中不出现数字

Pattern p1 = Pattern.compile("\\D*");
Matcher m1 = p1.matcher("as1asd234");
boolean bool1 = m1.matches();  //==> false 从题意可知,是对整个字符串匹配,显然 find()方法就不适用了

问题三:判断字符串必须以字符开始

Pattern p1 = Pattern.compile("\\D*");
Matcher m1 = p1.matcher("as1asd234");
boolean bool1 = m1.lookingAt();  //==> true

提示:上边问题的解答只是为了更清楚的掌握 find(),matches(),lookingAt()方法的使用,我们在学习了丰富的匹配语法后,只通过matches()方法也可以实现同样的功能

2)Matcher索引方法

上边的find()方法能找出字符串中满足匹配规则的某一部分,如果想获取这一部分的位置该怎么做呢。

1

public int start()

返回以前匹配的初始索引。

3

public int end()

返回最后匹配字符之后的偏移量。

Pattern p1 = Pattern.compile("zs");
Matcher m1 = p1.matcher("abcdseasdfzsh wes zs wef");
while (m1.find()){
      System.out.println("位置:"+m1.start()+"--"+m1.end());
}
/*
//-----输出
位置:10--12
位置:18--20

可见 while 执行了两次,find()方法第一次是从字符串开始查找,找到符合匹配规则的子字符串返回,并记录位置,下次从这个位置开始查找 
*/

3)捕获组的使用

这时新的需求来了,我们不但要找到符合匹配规则的子字符串的位置,还要将子字符串提取出来。

//找出 字符器 abcdseasdfzsh wes zs wef 中 zs 出现的位置

Pattern p1 = Pattern.compile("(zs)");
Matcher m1 = p1.matcher("abcdseasdfzsh wes zs wef");
while (m1.find()){
       System.out.println("位置:"+m1.start()+"--"+m1.end()+"内容为:"+m1.group(1));
}
/*
位置:10--12内容为:zs
位置:18--20内容为:zs
*/

简单吗,只是在匹配规则中加入了(),就可以通过捕获组直接提取子字符串了。可见()不影响原有的匹配规则。group(1)代表第一个匹配规则也就是(zs)。如匹配规则为"(zs)(cd)",我们要捕获(cd)要用 group(2)

上面只是捕获组的简单使用(连匹配规则都是字母,这种情况我们是很少使用的),下面看一个复杂点的场景

//字符串 ha:ha name:zsw age:12 h:ei 中提取 name 与 age
Pattern p1 = Pattern.compile(".*name:(.*)\\sage:(\\d*)\\s.*");
Matcher m1 = p1.matcher("ha:ha name:zsw age:12 h:ei");
m1.matches(); //一定要查找次,
System.out.println("姓名:"+m1.group(1)+" 年龄:"+m1.group(2));
/* 输出
姓名:zsw 年龄:12
*/

java正则不能有连续逗号 java正则不包含_java正则不能有连续逗号

这里 name:  \\s的作用就是分隔,因为  .* 代表匹配多个字符,如果我们不分隔,只前边的 .* 就会把整个字符串匹配完。所以要用明显的特征把信息分隔

4)替换方法

3

public String replaceAll(String replacement)

 替换模式与给定替换字符串相匹配的输入序列的每个子序列。

4

public String replaceFirst(String replacement)

 替换模式与给定替换字符串匹配的输入序列的第一个子序列。

//将字符串 ha:ha name:zsw age:12 h:ei 中的 ha 全部替换为 csdn
Pattern p1 = Pattern.compile("ha");
Matcher m1 = p1.matcher("ha:ha name:zsw age:12 h:ei");
String r1 = "";
while (m1.find()){
      r1 = m1.replaceAll("csdn");
}
System.out.println("替换后为:"+r1);

/*输出:
替换后为:csdn:csdn name:zsw age:12 h:ei
*/

四、总结

上面是java正则表达式的常用应用,只是子解其简单功能,还应该去学习更多匹配规格。

参考文章(此文章记录了完整的使用方法):https://www.runoob.com/java/java-regular-expressions.html