Java正则表达式易错知识点汇总

 更新时间:2015年12月14日 10:42:24   作者:leizhimin  
这篇文章主要总结Java正则表达式易错知识,对易错知识点进行分类整理,帮助大家更好的学习Java正则表达式,感兴趣的小伙伴们可以参考一下

一、概述
正则表达式是Java处理字符串、文本的重要工具。
Java对正则表达式的处理集中在以下两个类:
java.util.regex.Matcher   模式类用来表示一个编译过的正则表达式。
java.util.regex.Pattern   匹配类:用模式匹配一个字符串所表达的抽象结果。
(很遗憾,Java Doc并没有给出这两个类的职责概念。) 
比如一个简单例子:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

/** 
* 正则表达式例子 
* 
* @author leizhimin 2009-7-17 9:02:53 
*/ 
public class TestRegx { 
    public static void main(String[] args) { 
        Pattern p = Pattern.compile("f(.+?)k"); 
        Matcher m = p.matcher("fckfkkfkf"); 
        while (m.find()) { 
            String s0 = m.group(); 
            String s1 = m.group(1); 
            System.out.println(s0 + "||" + s1); 
        } 
        System.out.println("---------"); 
        m.reset("fucking!"); 
        while (m.find()) { 
            System.out.println(m.group()); 
        } 

        Pattern p1 = Pattern.compile("f(.+?)i(.+?)h"); 
        Matcher m1 = p1.matcher("finishabigfishfrish"); 
        while (m1.find()) { 
            String s0 = m1.group(); 
            String s1 = m1.group(1); 
            String s2 = m1.group(2); 
            System.out.println(s0 + "||" + s1 + "||" + s2); 
        } 

        System.out.println("---------"); 
        Pattern p3 = Pattern.compile("(19|20)\\d\\d([- /.])(0[1-9]|1[012])\\2(0[1-9]|[12][0-9]|3[01])"); 
        Matcher m3 = p3.matcher("1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900-01.01 1900 13 01 1900 02 31"); 
        while (m3.find()) { 
            System.out.println(m3.group()); 
        } 
    } 
}
 

输出结果:
fck||c
fkk||k
---------
fuck
finish||in||s
fishfrish||ishfr||s
---------
1900-01-01
2007/08/13
1900.01.01
1900 01 01
1900 02 31

Process finished with exit code 0
 二、一些容易迷糊的问题
 1、Java对反斜线处理的问题 
在其他语言中,\\表示要插入一个字符\;
在Java语言中,\\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。 
a.预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
 但是看看上面程序,对比下不难看出:
\d在实际使用的时候就写成了 \\d;
在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成\\\\,原因是下面的APIDoc定义\\表示一个反斜线。
但是如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r. 
b.字符
x 字符 x
\\ 反斜线字符
\0n 带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 带有十六进制值 0x 的字符 hh
\uhhhh 带有十六进制值 0x 的字符 hhhh
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
\e 转义符 ('\u001B')
\cx 对应于 x 的控制符
2、Matcher.find():尝试查找与模式匹配的字符序列的下一个子序列。此方法从字符序列的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始,即如果前一次找到与模式匹配的子序列则这次从这个子序列后开始查找。
3、Matcher.matchers():判断整个字符序列与模式是否匹配。当连续用Matcher对象检查多个字符串时候,可以使用
Matcher.reset():重置匹配器,放弃其所有显式状态信息并将其添加位置设置为零。
或者Matcher.reset(CharSequence input)  重置此具有新输入序列的匹配器,来重复使用匹配器。
4、组的概念,这个概念很重要,组是用括号划分的正则表达式,可以通过编号来引用组。组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。
例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;
A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。 
int groupCount():返回匹配其模式中组的数目,不包括第0组。
String group():返回前一次匹配操作(如find())的第0组。
String group(int group):返回前一次匹配操作期间指定的组所匹配的子序列。如果该匹配成功,但指定组未能匹配字符序列的任何部分,则返回 null。
int start(int group):返回前一次匹配操作期间指定的组所匹配的子序列的初始索引。
int end(int group):返回前一次匹配操作期间指定的组所匹配的子序列的最后索引+1。
5、匹配的范围的控制
最变态的就要算lookingAt()方法了,名字很让人迷惑,需要认真看APIDoc。 
start()  返回以前匹配的初始索引。
end()  返回最后匹配字符之后的偏移量。
public boolean lookingAt()尝试将从区域开头开始的输入序列与该模式匹配。
与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。
如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
返回:
当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。
小编为大家整理了这些易混知识点,但是还是不够全面,需要大家在之后的学习中不断积累,正则表达式最大的难点在于熟练书写正则表达式,大家应该针对难点进行学习,相信一定会有所收获。

相关文章

  • SpringBoot实现过滤器和拦截器的方法

    SpringBoot实现过滤器和拦截器的方法

    大家应该都晓得实现过滤器需要实现 javax.servlet.Filter 接口,而拦截器会在处理指定请求之前和之后进行相关操作,配置拦截器需要两步,本文通过实例代码给大家介绍SpringBoot 过滤器和拦截器的相关知识,感兴趣的朋友一起看看吧
    2022-11-11
  • jcl与jul log4j1 log4j2 logback日志系统机制及集成原理

    jcl与jul log4j1 log4j2 logback日志系统机制及集成原理

    这篇文章主要介绍了jcl与jul log4j1 log4j2 logback的集成原理,Apache Commons-logging 通用日志框架与日志系统的机制,有需要的朋友可以借鉴参考下
    2022-03-03
  • SpringBoot新手入门的快速教程

    SpringBoot新手入门的快速教程

    这篇文章主要给大家介绍了关于SpringBoot新手入门的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • Zookeeper连接超时问题与拒绝连接的解决方案

    Zookeeper连接超时问题与拒绝连接的解决方案

    今天小编就为大家分享一篇关于Zookeeper连接超时问题与拒绝连接的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • mybatis中sql语句CDATA标签的用法说明

    mybatis中sql语句CDATA标签的用法说明

    这篇文章主要介绍了mybatis中sql语句CDATA标签的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring Data Jpa 自动生成表结构的方法示例

    Spring Data Jpa 自动生成表结构的方法示例

    这篇文章主要介绍了Spring Data Jpa 自动生成表结构的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java中Excel高效解析工具EasyExcel的实践

    Java中Excel高效解析工具EasyExcel的实践

    EasyExcel是阿里巴巴开源的一个excel处理框架,已使用简单,节省内存著称,下面这篇文章主要给大家介绍了关于Java中Excel高效解析工具EasyExcel实践的相关资料,需要的朋友可以参考下
    2022-04-04
  • java去除重复对象的简单实例

    java去除重复对象的简单实例

    下面小编就为大家带来一篇java去除重复对象的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Springboot 读取自定义pro文件注入static静态变量方式

    Springboot 读取自定义pro文件注入static静态变量方式

    这篇文章主要介绍了Springboot 读取自定义pro文件注入static静态变量方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java语法糖之jdk迭代的新特性汇总

    java语法糖之jdk迭代的新特性汇总

    什么是语法糖?泛型、自动装箱拆箱、变长参数、增强for循环、switch字符类型、lambda表达式等,这些其实都是语法糖。这篇文章主要给大家介绍了关于java语法糖之jdk迭代的新特性的相关资料,需要的朋友可以参考下
    2021-05-05

最新评论