如何在特定字符串后获得更多组匹配?

How to get more group matches after specific string?

如何获取更多组正则表达式?

我想提取以下字符串的子字符串:

group g1 l1 l2 l3 g2 g3.l1

作为团体。输出应包括 g1、l1、l2、l3、g2 和 g3.l1。

我已经试过用这样的正则表达式得到这些:

group (\S+)\s(\S+)*

我的问题是,我可以使用组表达式 ( ) 得到不同的组,但我可以获得或多或少的这些子字符串。我的字符串也可能是这样的:group g1 g2.l1

您的模式从匹配 group 开始,然后使用 2 个捕获组。您只有 2 组,因为最后一组中的重复重复仅匹配非 whitespace char \S 并且不会匹配 whitespace char.

如果您将其更改为 (\s\S+)*,您将重复捕获组,仅捕获最后一次重复的值。

你可能会做的是利用 \G 通过断言上一场比赛结束时的位置来获得重复比赛

(?:^group |\G(?!^))(\S+)(?:\s+|$)

在java

String regex = "(?:^group |\G(?!^))(\S+)(?:\s+|$)";

那将匹配

  • (?:非捕获组
    • ^group匹配组和一个space处的字符串
    • |
    • \G(?!^) 断言位置在上一个匹配的末尾,而不是在字符串的开头
  • )关闭非捕获组
  • (\S+) 在组 1 中捕获匹配 1+ 个非白色space 个字符
  • (?:\s+|$) 匹配 1+ whitespace 个字符或断言字符串结尾

Regex demo | Java demo

例如

String regex = "(?:^group |\G(?!^))(\S+)(?:\s+|$)";
String string = "group g1 l1 l2 l3 g2 g3.l1";

Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

结果

g1
l1
l2
l3
g2
g3.l1

如果我们希望捕获那些用 space 分隔的字母数字,并单独捕获单词 group,我们可以使用更改设计一个简单的表达式:

(group|another_group)|([^\s]+)

这里我们将简单地传递组,或者如果有的话,传递其他组:

(group|another_group)

然后我们收集除 spaces 之外的所有内容:

([^\s]+)

Demo

测试

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

final String regex = "(group|another_group)|([^\s]+)";
final String string = "group g1 l1 l2 l3 g2 g3.l1\n"
     + "another_group g1 l1 l2 l3 g2 g3.l1";

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));
    }
}

正则表达式电路

jex.im 可视化正则表达式: