Pattern.complie(String regex) 方法可用来生成 Matcher 类,但它还有个重载的 Pattern.complie(String regex,int flag)方法可以用来指定各种匹配模式。
今天就和大家一起来学习 Pattern 类的几种不同匹配模式:
- Pattern.CANON_EQ
此模式下进行匹配会考虑字符的等价性,例如:正则表达式 u003f 会匹配字符 ?, 因为 ?的 unicode 编码就是 u003f。
Pattern p = Pattern.compile("\u003f",Pattern.CANON_EQ);
System.out.println(p.matcher("?").matches());
true
2.Pattern.CASE_INSENSITIVE(?i)
此模式下进行匹配会忽略 US-ASCII字符集中的大小写敏感,若需要忽略 Unicode 中的大小写敏感,需要结合 Pattern.UNICODE_CASE 使用。
若需要同时开启 Pattern 的多种匹配模式,可以通过 ( | ) 组合多个标记。
Pattern p = Pattern.compile("[A-Z]+", Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
System.out.println(p.matcher("abc").matches());
true
可在正则表达式开头定义 (?i) 开启此模式。
Pattern p = Pattern.compile("(?i)|(?u)[A-Z]+");
System.out.println(p.matcher("abc").matches());
true
3.Pattern.CASE_INSENSITIVE (?u)
此模式下进行匹配会忽略 Unicode 字符集中的大小写敏感。
可在正则表达式开头定义 (?u) 开启此模式。
4.Pattern.COMMENTS(?x)
此模式下进行匹配会忽略正则表达式中的空格及#开始后面的部分。
可在正则表达式开头定义 (?x) 开启此模式。
Pattern p1 = Pattern.compile("#[A-Z]+");
System.out.println(p1.matcher("#ABC").matches());
Pattern p2 = Pattern.compile("#[A-Z]+", Pattern.COMMENTS);
System.out.println(p2.matcher("#ABC").matches());
Pattern p3 = Pattern.compile("[0-9]+#[A-Z]+", Pattern.COMMENTS);
System.out.println(p3.matcher("123").matches());
Pattern p4 = Pattern.compile("[A-Z]+ [0-9]+");
System.out.println(p4.matcher("ABC123").matches());
Pattern p5 = Pattern.compile("[A-Z]+ [0-9]+",Pattern.COMMENTS);
System.out.println(p5.matcher("ABC123").matches());
true false true false true
5.Pattern.DOTALL(?s)
此模式下 "."会匹配换行符,默认匹配模式下 “.” 不会匹配换行符。
可在正则表达式开头定义 (?s) 开启此模式。
Pattern p = Pattern.compile("[A-Z].*");
System.out.println(p.matcher("ABCnDEF").matches());
Pattern p2 = Pattern.compile("[A-Z].*",Pattern.DOTALL);
System.out.println(p2.matcher("ABCnDEF").matches());
false true
6.Pattern.MULTILINE(?m)
在此模式会开启多行匹配,默认模式下只会匹配字符串的第一行,多行模式会根据 ^ 和 $ 分别匹配每一行的开始和结束。
可在正则表达式开头定义 (?m) 开启此模式。
Pattern p = Pattern.compile("^.*BC$");
Matcher m = p.matcher("ABnBC");
System.out.println(m.find());
Pattern p2 = Pattern.compile("^.*BC$", Pattern.MULTILINE);
Matcher m2 = p2.matcher("ABnBC");
if (m2.find()) {
System.out.println("m2 group:" + m2.group());
}
false m2 group:BC
7.Pattern.UNIX_LINES(?d)
在此模式下进行匹配,在 . 、^ 、$ 三种行为中,只会将 n 认作换行符,默认模式下会将 r 也认作换行符。
可在正则表达式开头定义 (?d) 开启此模式。
开启 Pattern.UNIX_LINES 模式后,总共匹配了三次字符,分别是(Ar)、(BrC)、(D),在 IDEA 控制台中看不到 r 的打印效果,可以通过断点进行调试查看或者通过 CMD 运行程序。
String data = "ArnBrCnD";
System.out.println(data);
Matcher m = Pattern.compile(".+").matcher(data);
while (m.find()) {
System.out.println("["+m.group()+"]");
}
m = Pattern.compile(".+",Pattern.UNIX_LINES).matcher(data);
while (m.find()) {
System.out.println("["+m.group()+"]");
}
A B C D [A] [B] [C] [D] [A ] [B C] [D]
- Pattern.LITERAL
此模式下所有的转移字符或元字符都将表示字面含义,不代表任何特殊意义
Pattern p = Pattern.compile("\s");
System.out.println(p.matcher("\s").matches());
Pattern p2 = Pattern.compile("\s", Pattern.LITERAL);
System.out.println(p2.matcher("\s").matches());
false true
9.Pattern.UNICODE_CHARACTER_CLASS
此匹配模式下会启用Unicode版本的预定义字符类和POSIX字符类。
查找多方资料暂时发现一种用法:
w 默认只匹配[a-zA-Z0-9] 开启此模式后,w 可以匹配任何语言的任何字符。
可在正则表达式开头定义 (?U) 开启此模式。
Pattern p1 = Pattern.compile("\w+");
System.out.println(p1.matcher("中国").matches());
Pattern p2 = Pattern.compile("\w+", Pattern.UNICODE_CHARACTER_CLASS);
System.out.println(p2.matcher("中国").matches());
false true
本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!



