我有一根绳子:
1aa[appleax]bb[appley]
我想通过正则表达式捕获
applex
和 appley
,如果还有更多 - 我也想捕获它们。我想要括号里的文字。
这里有一个问题:只有当它们追随
1
时我才想捕获它们。如果他们先去1
- 我不感兴趣。
我已经尝试过这两种方法(如下),但它们要么给我
applex
,要么给我appley
(贪婪/懒惰)。但我想要全部。有人知道我可以用什么吗?
我尝试过的方法:
applex
:1.*?\[(\w*)\]
appley
:1.*\[(\w*)\]
您需要使用量词进行积极的回顾。使用 Java,您可以在任何 Java > 8 上使用此功能。
(?<=1.*\[)\w+(?=\])
说明:(演示)
(?<=1.*\[)
:正向后查找,检查前面的字符是否包含 1 后跟任何内容,然后以 [
结尾。既然你对空格不感兴趣, .* 就足够了。但如果您想忽略空格,则可以在正则表达式中将 (?<=1.*\[)
替换为 (?<=1\S*\[)
。\w+
:这是你想要的词(?=\])
:这确认您的单词包含在这个]
中。这里 ?=
确保正向前瞻。示例 Java 代码:(run)
final String regex = "(?<=1.*\\[)\\w+(?=\\])";
final String string = "I have a string line: 1aa[appleax]bb[appley]\n\n"
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
为了实现捕获字符串中数字 1 之后的括号之间的所有单词的预期结果,您可以在正则表达式中使用正向先行断言。此断言确保正则表达式引擎仅在后面跟有另一个模式时才匹配该模式。以下是修改正则表达式模式的方法:
1(?=.*?\[(\w*)\])\w*\[([^\]]+)\]
说明:
此模式将成功捕获字符串中数字 1 之后的括号之间的所有单词。
这是一个适用于任何 Java 版本的正则表达式模式:
String s = "1aa[appleax]bb[appley]";
Pattern pattern = Pattern.compile("(?:\\G(?!^)|1)[a-z]*\\[([^\\]\\[]*)]");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println(matcher.group(1)); // => appleax appley
}
详情:
(?:\G(?!^)|1)
- 匹配 1
或前一个成功匹配的结尾[a-z]*
- 零个或多个小写 ASCII 字母\[
- 一个 [
字符([^\]\[]*)
- 第 1 组:除 [
和 ]
]
- 一个 ]
字符。注意:我假设
1
和括号之间只有ASCII小写字母。如果除了括号和空格之外还有任何内容,请将 [a-z]*
替换为 [^\[\]\s]*
(代码中的 [^\\[\\]\\s]*
)。