在Java中,可以使用正则表达式捕获分组和非捕获分组。
捕获分组使用圆括号将需要捕获的表达式括起来,例如:
String text = "Hello, world!"; Pattern pattern = Pattern.compile("(\\w+),\\s(\\w+)!"); Matcher matcher = pattern.matcher(text); if (matcher.find()) { String group1 = matcher.group(1); String group2 = matcher.group(2); System.out.println(group1); // 输出 Hello System.out.println(group2); // 输出 world }
在这个例子中,正则表达式 (\w+),\s(\w+)! 匹配一个逗号后跟一个空格的单词,然后是一个感叹号。捕获分组使用圆括号将单词表达式括起来,并将其捕获到组1和组2中。
(\w+),\s(\w+)!
非捕获分组使用 (?:expression) 的语法,例如:
(?:expression)
String text = "I like Java, but not JavaScript."; Pattern pattern = Pattern.compile("Java(?:Script)?"); Matcher matcher = pattern.matcher(text); while (matcher.find()) { String match = matcher.group(); System.out.println(match); // 输出 Java 和 JavaScript }
在这个例子中,正则表达式 Java(?:Script)? 匹配单词 Java 和 JavaScript,但只捕获 Java。在这个例子中,使用 group() 方法获取与整个正则表达式匹配的字符串,而不是捕获组。
Java(?:Script)?
group()
还有一种特殊的非捕获分组语法是零宽度正预测先行断言,使用 (?=expression) 的语法。这种语法可以用来匹配某些位置前面的内容,但不捕获该内容。
(?=expression)
例如,可以使用零宽度正预测先行断言来匹配包含至少一个大写字母的单词,但不匹配任何实际字符。这可以使用以下正则表达式实现:
String text = "This Is A Test"; Pattern pattern = Pattern.compile("\\b(?=[A-Z])[A-Za-z]*\\b"); Matcher matcher = pattern.matcher(text); while (matcher.find()) { String match = matcher.group(); System.out.println(match); // 输出 This 和 Test }
在这个例子中,正则表达式 \\b(?=[A-Z])[A-Za-z]*\\b 匹配一个单词,这个单词至少包含一个大写字母。但是,它不会捕获该单词的任何内容。相反,使用 group() 方法返回匹配的字符串。
\\b(?=[A-Z])[A-Za-z]*\\b
除了零宽度正预测先行断言外,还有其他零宽度分组,如零宽度负预测先行断言和零宽度回顾后发断言等。这些分组可以用于更高级的正则表达式匹配和替换。
除了捕获分组和非捕获分组外,还有一些其他的正则表达式元字符和API可以用于文本匹配和处理。以下是一些常用的元字符和API:
^
^Hello
$
world!$
.
H.llo
*
ab*c
+
ab+c
?
colou?r
|
red|blue
\
\$100
Java中处理正则表达式的主要API是 java.util.regex 包中的类和方法,包括 Pattern、Matcher、PatternSyntaxException 等。可以使用这些类和方法来编译、匹配和替换正则表达式。
java.util.regex
Pattern
Matcher
PatternSyntaxException
原文链接:codingdict.net