最简单的java正则表达式

it2023-04-16  73

最简单的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() 方法,尝试将整个字符串与规则匹配(整个字符串都必须满足这个规则)。下边看其他常用的匹配模式

1public boolean lookingAt()  尝试将从区域开头开始的输入序列与该模式匹配。2public boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。4public 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()方法能找出字符串中满足匹配规则的某一部分,如果想获取这一部分的位置该怎么做呢。

1public int start() 返回以前匹配的初始索引。3public 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 */

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

4)替换方法

3public String replaceAll(String replacement)  替换模式与给定替换字符串相匹配的输入序列的每个子序列。4public 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

最新回复(0)