Pattern的多种匹配模式

参考: 好文→ Pattern的多种匹配模式 – 《JAVA编程思想》42

模式
单行模式Pattern.DOTALL(?s)
多行模式Pattern.MULTILINE(?m)
忽略大小写(ASCII字符集)Pattern.CASE_INSENSITIVE(?i)
忽略大小写(Unicode字符集)Pattern.UNICODE_CASE(?u)
字面字符Pattern.LITERAL
字符的等价性Pattern.CANON_EQ
注释模式Pattern.COMMENTS(?x)
Unix 行模式Pattern.UNIX_LINES(?d)
启用 Unicode 字符类支持Pattern.UNICODE_CHARACTER_CLASS(?U)
// 匹配单个
Pattern.compile("[A-Z].*", Pattern.DOTALL).matcher("ABC\nDEF").matches()
Pattern.compile("(?s)[A-Z].*").matcher("ABC\nDEF").matches()

// 匹配多个
Pattern.compile("[A-Z]+", Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE).matcher("abc").matches()
Pattern.compile("(?i)|(?u)[A-Z]+").matcher("abc").matches()

在这里插入图片描述

单行匹配

整个输入字符串被视为一行。此模式下 "."会匹配换行符(\n)。Java正则表达式默认是单行模式。

# 默认匹配
Pattern.compile("[A-Z].*").matcher("ABC\nDEF").matches(); // false
# 思路引导1. 先看方法是matches,表示整个字符串都匹配上正则表达式。
# 思路引导2. [A-Z]开头后面不包含\n就行

# 默认查找
Matcher matcher = Pattern.compile("[A-Z].*").matcher("ABC\nDEF");
while (matcher.find()) {
    System.out.print("," + matcher.group() + ""); // ,ABC,DEF
}
# 思路引导1. 先看方法是find,字符串某个部分匹配上正则表达式即可。
# 思路引导2. [A-Z]开头后面不包含\n就行

# DOTALL匹配
System.out.println(Pattern.compile("[A-Z].*", Pattern.DOTALL).matcher("ABC\nDEF").matches()); // true
# 思路引导1. 先看方法是matches,查看是整个字符串都匹配上正则表达式。
# 思路引导2. [A-Z]开头后面任意

# DOTALL查找
Matcher matcher3 = Pattern.compile("[A-Z].*", Pattern.DOTALL).matcher("ABC\nDEF");
while (matcher3.find()) {
    System.out.print("," + matcher3.group() + ""); // ABC\nDEF
}

在这里插入图片描述

多行匹配

输入字符串被视为多行。

# 默认查找
System.out.println(Pattern.compile(".*BC").matcher("AB\nBC").find()); // true

# 默认查找
System.out.println(Pattern.compile("^.*BC$").matcher("AB\nBC").find()); // false
# 思路引导1.^$+find等价于matchs,查看是整个字符串都匹配上正则表达式。
# 思路引导2.前面谁都行就是不能为\n
System.out.println(Pattern.compile("^.*BC$").matcher("AB\nBC").matches()); // false

# MULTILINE查找
Matcher m2 = Pattern.compile("^.*BC$", Pattern.MULTILINE).matcher("AB\nBC");
if (m2.find()) {
    System.out.println(m2.group()); // BC
}

# MULTILINE查找
Matcher m3 = Pattern.compile("\\A.*BC\\Z", Pattern.MULTILINE).matcher("AB\nBC");
if (m3.find()) {
    System.out.println(m3.group()); // 没匹配到
}

[Q&A]正则 为何要区分单行模式和多行模式
这两种模式主要影响正则表达式中的行定位符 ^$ 的行为。
默认情况:^ 匹配字符串的开头$匹配字符串的末尾字符串末尾的\n之前
单行模式:^$ 匹配整个字符串。
多行模式:^$ 分别匹配每行的开始和结束。如需匹配字符串开始和结束,可用 \A\Z

在这里插入图片描述

忽略大小写

  • Pattern.CASE_INSENSITIVE / (?i): 此模式下进行匹配会忽略 US-ASCII字符集中的大小写敏感。
  • Pattern.UNICODE_CASE / (?u):此模式下进行匹配会忽略Unicode 字符集中的大小写敏感
// 忽略 Unicode 中的大小写敏感
System.out.println(Pattern.compile("[A-Z]+", Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE).matcher("abc").matches()); // true
System.out.println(Pattern.compile("(?i)|(?u)[A-Z]+").matcher("abc").matches());  // true

// 忽略 US-ASCII字符集中的大小写敏感
System.out.println(Pattern.compile("[A-Z]+", Pattern.CASE_INSENSITIVE).matcher("abc").matches()); // true
System.out.println(Pattern.compile("(?i)[A-Z]+").matcher("abc").matches()); // true

在这里插入图片描述

正则表达式中的所有字符视为字面字符

Pattern.LITERAL:此模式下所有的转义字符或元字符都将表示字面含义,不代表任何特殊意义.

System.out.println(Pattern.compile("\\s").matcher("\\s").matches()); // false
System.out.println(Pattern.compile("\\s", Pattern.LITERAL).matcher("\\s").matches()); // true

在这里插入图片描述

等价匹配

Pattern.CANON_EQ:此模式下进行匹配会考虑字符的等价性。例如:正则表达式 \u003f 会匹配字符 , 因为 的 unicode 编码就是 \u003f

System.out.println(Pattern.compile("\\u003f", Pattern.CANON_EQ).matcher("?").matches()); // true

在这里插入图片描述

注释模式

Pattern.COMMENTS / (?x):正则表达式中的空白字符(如空格、制表符、换行符等)将被忽略,并且可以使用 # 符号来添加注释。

Pattern p1 = Pattern.compile("#[A-Z]+");
System.out.println(p1.matcher("#ABC").matches()); // true

Pattern p2 = Pattern.compile("#[A-Z]+", Pattern.COMMENTS);
System.out.println(p2.matcher("#ABC").matches()); // false

Pattern p3 = Pattern.compile("[0-9]+#[A-Z]+", Pattern.COMMENTS);
System.out.println(p3.matcher("123").matches()); // true

Pattern p4 = Pattern.compile("[A-Z]+ [0-9]+");
System.out.println(p4.matcher("ABC123").matches()); // false

Pattern p5 = Pattern.compile("[A-Z]+ [0-9]+", Pattern.COMMENTS);
System.out.println(p5.matcher("ABC123").matches()); // true

在这里插入图片描述

Unix 行模式

Pattern.UNIX_LINES / (?d)
1、只会将 \n 认作换行符。
2、行定位符 ^$ 只会匹配行的开始和结束位置,. 不会匹配换行符。

String data = "A\r\nB\rC\nD";
System.out.println(data);
System.out.println("-------------------------------------");

Matcher m = Pattern.compile(".+").matcher(data);
while (m.find()) {
    System.out.println("[" + m.group() + "]");  // [A][B][C][D]
}
System.out.println("-------------------------------------");

m = Pattern.compile(".+", Pattern.UNIX_LINES).matcher(data);
while (m.find()) {
    System.out.println("[" + m.group() + "]");  // (A\r)、(B\rC)、(D)
}

在这里插入图片描述

启用 Unicode 字符类支持

Pattern.UNICODE_CHARACTER_CLASS/ (?U)\w 默认只匹配[a-zA-Z_0-9] 开启此模式后,\w 可以匹配任何语言的任何字符。

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());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值