likes
comments
collection
share

Java正则表达式之Pattern的flag

作者站长头像
站长
· 阅读数 5

在Java中,Pattern类用于表示一个正则表达式,并且可以通过不同的标志(flags)来修改正则表达式的行为。这些标志是Pattern类中的静态常量,并且可以通过位或(|)操作符组合使用。

以下是Pattern类中定义的一些常用标志:

  1. Pattern.CASE_INSENSITIVE:启用不区分大小写的匹配。
  2. Pattern.MULTILINE:启用多行模式。这样,^$分别匹配输入序列的开始和结束,以及任何行终止符之后的序列开始和之前的序列结束。
  3. Pattern.DOTALL:启用dotall模式。在这种模式下,.匹配任何字符,包括行终止符。
  4. Pattern.UNICODE_CASE:启用Unicode感知的大小写折叠。当与CASE_INSENSITIVE结合使用时,它允许对Unicode字符进行大小写不敏感的匹配。
  5. Pattern.UNIX_LINES:启用Unix行模式。在这种模式下,只有\n被识别为行终止符。
  6. Pattern.CANON_EQ:启用规范等价。当与CASE_INSENSITIVE结合使用时,它允许匹配两个字符,即使它们的Unicode规范分解不同,但它们的规范等价是相同的。
  7. Pattern.LITERAL:启用模式的字面值解析。输入字符串作为字面值字符序列来匹配,元字符或转义序列不具有特殊意义。

这些标志可以通过位或操作符组合使用,例如:

Pattern pattern = Pattern.compile("xxxxRegexExpress", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

在上面的例子中,正则表达式yourRegex将被编译为不区分大小写且支持多行模式的模式。

请注意,不同的标志可能会影响正则表达式的行为,因此在选择标志时要仔细考虑你的需求。

flag描述
UNIX_LINES启用 Unix 换行模式
CASE_INSENSITIVE启用不区分大小写的匹配
COMMENTS允许模式中的空格和注释
MULTILINE启用多行模式
LITERAL启用模式的文字解析
DOTALL启用 dotall 模式
UNICODE_CASE启用 Unicode 感知大小写折叠
CANON_EQ启用规范等价
UNICODE_CHARACTER_CLASS启用 Unicode 版本的预定义字符类和 POSIX 字符类
字段说明
Pattern.UNIX_LINES        unix行模式,大多数系统的行都是以\n结尾的,但是少数系统,比如Windows,却是以\r\n组合来结尾的,启用这个模式之后,将会只以\n作为行结束符,这会影响到^、$和点号(点号匹配换行符)。        通过嵌入式标志表达式 (?d) 也可以启用 Unix 行模式。
Pattern.CASE_INSENSITIVE        默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹配,只要将UNICODE_CASE与这个标志合起来就行了。        通过嵌入式标志表达式(?i)也可以启用不区分大小写的匹配。        指定此标志可能对性能产生一些影响。
Pattern.COMMENTS ⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢        这种模式下,匹配时会忽略(正则表达式里的)空格字符(不是指表达式里的”//s”,而是指表达式里的空格,tab,回车之类)和注释(从#开始,一直到这行结束)。        通过嵌入式标志表达式(?x) 也可以启用注释模式。
Pattern.MULTILINE        默认情况下,输入的字符串被看作是一行,即便是这一行中包好了换行符也被看作一行。当匹配“^”到“$”之间的内容的时候,整个输入被看成一个一行。启用多行模式之后,包含换行符的输入将被自动转换成多行,然后进行匹配。        通过嵌入式标志表达式 (?m) 也可以启用多行模式。
Pattern.LITERAL        启用字面值解析模式。        指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的元字符或转义序列不具有任何特殊意义。        标志 CASE_INSENSITIVE 和 UNICODE_CASE 在与此标志一起使用时将对匹配产生影响。其他标志都变得多余了。        不存在可以启用字面值解析的嵌入式标志字符。
Pattern.DOTALL        在这种模式中,表达式 .可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行结束符。        通过嵌入式标志表达式 (?s) 也可以启用此种模式(s 是 “single-line” 模式的助记符,在 Perl 中也使用它)。
Pattern.UNICODE_CASE        在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不敏感的匹配。默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。        指定此标志可能对性能产生影响。
Pattern.CANON_EQ        当且仅当两个字符的正规分解(canonical decomposition)都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式a/u030A会匹配?。默认情况下,不考虑规范相等性(canonical equivalence)。        指定此标志可能对性能产生影响。

在Java中,Pattern 类用于编译正则表达式,并提供匹配操作的方法。当编译正则表达式时,你可以使用一组标志(flags)来修改正则表达式的行为。这些标志是通过位或(|)运算符组合起来的。

以下是Pattern类中定义的一些常用标志:

  1. Pattern.CANON_EQ:启用规范等价。
  2. Pattern.CASE_INSENSITIVE (Pattern.UNIX_CASE 在UNIX模式下):启用不区分大小写的匹配。
  3. Pattern.COMMENTS:允许在模式中包含空白和注释。
  4. Pattern.DOTALL (Pattern.SINGLELINE):启用点号(.)匹配任何字符(包括行终止符)。
  5. Pattern.LITERAL:启用字面值解析模式。输入字符串被当作字面值字符串序列来对待。元字符或转义序列不具有特殊意义。
  6. Pattern.MULTILINE:启用多行模式。^$ 分别匹配输入序列的开始和结束,以及任何行终止符之后的开始和之前的结束。
  7. Pattern.UNICODE_CASE:启用Unicode感知的大小写折叠。
  8. Pattern.UNIX_LINES:启用UNIX行模式。在这种模式下,只有 \n 被识别为行终止符。

例如,如果你想要创建一个不区分大小写的正则表达式,并允许在模式中使用注释,你可以这样做:

Pattern pattern = Pattern.compile("(?i)yourRegexHere # this is a comment", Pattern.COMMENTS);

在上面的代码中,(?i) 是一个内嵌标志,用于启用不区分大小写的匹配,而 Pattern.COMMENTS 允许我们在正则表达式中使用注释。

注意:除了内嵌标志(如 (?i)),你也可以通过 Pattern.compile 方法的第二个参数传递标志。如果你同时使用内嵌标志和通过方法参数传递的标志,它们会共同生效。

Java正则表达式中的Pattern类用于表示编译后的正则表达式,而flag则是在编译正则表达式时使用的选项。以下是一些常用的flag:

  1. Pattern.CASE_INSENSITIVE(?i):忽略大小写。
  2. Pattern.MULTILINE(?m):多行模式,使得^和$可以匹配每一行的开头和结尾。
  3. Pattern.DOTALL(?s):让.匹配任何字符,包括换行符。
  4. Pattern.UNICODE_CASE(?u):启用Unicode感知的大小写折叠。
  5. Pattern.CANON_EQ(?c):当使用POSIX字符类语法时,使规范等价匹配。
  6. Pattern.COMMENTS(?x):允许在正则表达式中使用空格和注释。
  7. Pattern.LITERAL(?l):使字符串字面量表示为单个字符,而不是一个字符序列。

以下是一个使用这些flag的示例:

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

public class Main {
    public static void main(String[] args) {
        String text = "Hello, World!";
        String pattern = "(?i)hello";

        Pattern compiledPattern = Pattern.compile(pattern);
        Matcher matcher = compiledPattern.matcher(text);

        if (matcher.find()) {
            System.out.println("匹配成功");
        } else {
            System.out.println("匹配失败");
        }
    }
}

在这个示例中,我们使用了Pattern.CASE_INSENSITIVE flag来忽略大小写,使得正则表达式"hello"可以匹配"Hello"。

Java正则表达式中的Pattern类提供了一些标志(flag)来修改正则表达式的行为。这些标志可以在编译正则表达式时使用,以改变匹配的方式。下面是一些常用的Pattern标志:

  1. CASE_INSENSITIVE(大小写不敏感):使用该标志后,正则表达式将不区分大小写进行匹配。
Pattern pattern = Pattern.compile("abc", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("ABC");
System.out.println(matcher.find()); // 输出:true
  1. MULTILINE(多行模式):使用该标志后,^和$将匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾。
Pattern pattern = Pattern.compile("^abc", Pattern.MULTILINE);
Matcher matcher = pattern.matcher("abc\ndef");
System.out.println(matcher.find()); // 输出:true
  1. DOTALL(单行模式):使用该标志后,.将匹配包括换行符在内的任意字符。
Pattern pattern = Pattern.compile("a.b", Pattern.DOTALL);
Matcher matcher = pattern.matcher("a\nb");
System.out.println(matcher.find()); // 输出:true
  1. UNICODE_CASE(Unicode大小写不敏感):使用该标志后,大小写不敏感的匹配将按照Unicode字符的大小写规则进行。
Pattern pattern = Pattern.compile("ß", Pattern.UNICODE_CASE);
Matcher matcher = pattern.matcher("SS");
System.out.println(matcher.find()); // 输出:true

这些标志可以单独使用,也可以通过按位或(|)的方式组合使用。例如,同时使用CASE_INSENSITIVE和MULTILINE标志:

Pattern pattern = Pattern.compile("abc", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher matcher = pattern.matcher("ABC\nabc");
System.out.println(matcher.find()); // 输出:true
转载自:https://juejin.cn/post/7357909187953836073
评论
请登录