Pattern的多种匹配模式 -- 《JAVA编程思想》42

Pattern.complie(String regex) 方法可用来生成 Matcher 类,但它还有个重载的 Pattern.complie(String regex,int flag)方法可以用来指定各种匹配模式。

今天就和大家一起来学习 Pattern 类的几种不同匹配模式:

  1. 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("ABC\nDEF").matches());
        Pattern p2 = Pattern.compile("[A-Z].*",Pattern.DOTALL);
        System.out.println(p2.matcher("ABC\nDEF").matches());
false
true

6.Pattern.MULTILINE(?m)

在此模式会开启多行匹配,默认模式下只会匹配字符串的第一行,多行模式会根据 ^ 和 $ 分别匹配每一行的开始和结束。

可在正则表达式开头定义 (?m) 开启此模式。

        Pattern p = Pattern.compile("^.*BC$");
        Matcher m = p.matcher("AB\nBC");
        System.out.println(m.find());
        Pattern p2 = Pattern.compile("^.*BC$", Pattern.MULTILINE);
        Matcher m2 = p2.matcher("AB\nBC");
        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 模式后,总共匹配了三次字符,分别是(A\r)、(B\rC)、(D),在 IDEA 控制台中看不到 \r 的打印效果,可以通过断点进行调试查看或者通过 CMD 运行程序。

        String data = "A\r\nB\rC\nD";
        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]

  1. 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

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

おすすめ

転載: blog.csdn.net/BaymaxCS/article/details/119281231