在Java中,Pattern
类用于表示一个正则表达式,并且可以通过不同的标志(flags)来修改正则表达式的行为。这些标志是Pattern
类中的静态常量,并且可以通过位或(|
)操作符组合使用。
以下是Pattern
类中定义的一些常用标志:
Pattern.CASE_INSENSITIVE
:启用不区分大小写的匹配。Pattern.MULTILINE
:启用多行模式。这样,^
和$
分别匹配输入序列的开始和结束,以及任何行终止符之后的序列开始和之前的序列结束。Pattern.DOTALL
:启用dotall模式。在这种模式下,.
匹配任何字符,包括行终止符。Pattern.UNICODE_CASE
:启用Unicode感知的大小写折叠。当与CASE_INSENSITIVE
结合使用时,它允许对Unicode字符进行大小写不敏感的匹配。Pattern.UNIX_LINES
:启用Unix行模式。在这种模式下,只有\n
被识别为行终止符。Pattern.CANON_EQ
:启用规范等价。当与CASE_INSENSITIVE
结合使用时,它允许匹配两个字符,即使它们的Unicode规范分解不同,但它们的规范等价是相同的。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
类中定义的一些常用标志:
Pattern.CANON_EQ
:启用规范等价。Pattern.CASE_INSENSITIVE
(Pattern.UNIX_CASE
在UNIX模式下):启用不区分大小写的匹配。Pattern.COMMENTS
:允许在模式中包含空白和注释。Pattern.DOTALL
(Pattern.SINGLELINE
):启用点号(.
)匹配任何字符(包括行终止符)。Pattern.LITERAL
:启用字面值解析模式。输入字符串被当作字面值字符串序列来对待。元字符或转义序列不具有特殊意义。Pattern.MULTILINE
:启用多行模式。^
和$
分别匹配输入序列的开始和结束,以及任何行终止符之后的开始和之前的结束。Pattern.UNICODE_CASE
:启用Unicode感知的大小写折叠。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:
- Pattern.CASE_INSENSITIVE(?i):忽略大小写。
- Pattern.MULTILINE(?m):多行模式,使得^和$可以匹配每一行的开头和结尾。
- Pattern.DOTALL(?s):让.匹配任何字符,包括换行符。
- Pattern.UNICODE_CASE(?u):启用Unicode感知的大小写折叠。
- Pattern.CANON_EQ(?c):当使用POSIX字符类语法时,使规范等价匹配。
- Pattern.COMMENTS(?x):允许在正则表达式中使用空格和注释。
- 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标志:
- CASE_INSENSITIVE(大小写不敏感):使用该标志后,正则表达式将不区分大小写进行匹配。
Pattern pattern = Pattern.compile("abc", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("ABC");
System.out.println(matcher.find()); // 输出:true
- MULTILINE(多行模式):使用该标志后,^和$将匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾。
Pattern pattern = Pattern.compile("^abc", Pattern.MULTILINE);
Matcher matcher = pattern.matcher("abc\ndef");
System.out.println(matcher.find()); // 输出:true
- DOTALL(单行模式):使用该标志后,.将匹配包括换行符在内的任意字符。
Pattern pattern = Pattern.compile("a.b", Pattern.DOTALL);
Matcher matcher = pattern.matcher("a\nb");
System.out.println(matcher.find()); // 输出:true
- 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