Java使用正则表达式

先上示例。正则表达式的使用方法不唯一,下文代码仅供参考。
简而言之:Pattern类定义正则表达式,Matcher类进行匹配和输出结果。

     Pattern p = Pattern.compile("(c[a-z])[a-z]");
     Matcher m = p.matcher("vacation cost");
     while(m.find())
         System.out.println(m.group(1));//依次输出符合正则表达式第一个括号(c[a-z])字符串的结果
     m.reset();//重置匹配结果
     m.region(5, 12);//设定匹配范围索引[5, 12)
     while(m.find())
         System.out.println(m.group());//依次输出符合整个正则表达式的匹配结果

最重要的两个类是Pattern和Matcher。以下介绍这两个类中的常用方法。

\[\]

Pattern类

Pattern compile(String regex) 将给定的字符串转换为正则匹配模式。要求字符串符合正则表达式规范。

Pattern compile(String regex, int flags) 增加了flags参数。内容略多,请参考下文:Pattern类中的flags介绍

boolean matches(String regex, String s) 返回匹配是否成功。

matcher()

Pattern p = Pattern.compile("a*b");

Pattern p = Pattern.compile("");//括号内可以写regex,最终计算的regex以matches方法为准
String reg = "c*b";
String s = "aaaaab";
boolean isMatch = p.matches(res, s);//false

boolean isMatch = Pattern.matches("a*b", "aaaaaaab");//true

\[\]

Matcher类

boolean find(int start) 返回是否匹配到一个合法字符串。start缺省时从上一次匹配成功后的位置开始匹配。

boolean matches() 返回给定串是否完全符合正则表达式。

boolean lookingAt() 返回给定串的前缀部分是否符合正则表达式。

find(), lookingAt()和matches()的区别:只要给定字符串的 \([start, end]\) 范围内存在合法串,find()就会返回true;给定字符串的前缀部分(长度任意)满足正则表达式,lookingAt()返回true;给定字符串必须完全符合正则表达式,matches()才会返回true。

例如:

Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("vacation");
System.out.println(m.matches());//false
System.out.println(m.find());//true
System.out.println(m.find());//false

m = p.matcher("catalog");
System.out.println(m.matches());//false
System.out.println(m.lookingAt());//true

System.out.println(p.matches("cat", "vacation"));//false

Matcher region(int start, int end) 设定匹配时字符串的上下界,即 \([start, end)\)

String group() 返回上一次匹配成功时的匹配串。

String group(int g) 返回对正则表达式中第g个括号内内容的匹配结果。group(0)等价于group()。

int groupCount() 返回正则表达式中的括号组数

Matcher reset() 重置匹配状态

\[\]

几点补充

Java检查正则表达式时会保留换行符(但不会自动添加换行符)。举个例子:

        Pattern p = Pattern.compile("q[^u]");
        Matcher m = p.matcher("q\n");
        while(m.find())
            System.out.println(m.group()); //输出q

可以看到,Java将\n也视作一个字符,因此"q\n"匹配成功。但如果将表达式改为"q",则不会产生匹配结果。

\[\]

参考文档

https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html
https://docs.oracle.com/javase/10/docs/api/java/util/regex/Matcher.html
建议直接阅读文档,更清晰。

posted @ 2021-04-03 16:55  Kamigen  阅读(219)  评论(0编辑  收藏  举报

很高兴见到你,祝你旅途愉快!