如何在特定字符串后获取更多的分组匹配

时间:2019-06-01 13:23:06

标签: java regex

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

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

group g1 l1 l2 l3 g2 g3.l1

分组。输出应包括g1,l1,l2,l3,g2和g3.l1。

我已经尝试使用正则表达式来获取这些内容:

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

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

2 个答案:

答案 0 :(得分:0)

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

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

您可能要做的是利用\G通过在上一场比赛的结尾声明位置来重复进行比赛

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

在Java

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

这将匹配

  • (?:非捕获组
    • ^group匹配组和字符串中的空格
    • |
    • \G在上一场比赛结束时声明位置
  • )关闭非捕获组
  • (\S+)在组1中捕获,匹配1个以上非空格字符
  • (?:\s+|$)匹配1个以上空白字符或断言字符串的结尾

{{3}}

答案 1 :(得分:0)

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

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

在这里,我们将简单地通过组,或者其他组:

(group|another_group)

然后我们使用以下方法收集除空格以外的所有内容:

([^\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));
    }
}

RegEx电路

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

enter image description here