【问题标题】:How to get more group matches after specific string?如何在特定字符串后获得更多组匹配?
【发布时间】:2019-10-17 19:34:33
【问题描述】:

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

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

group g1 l1 l2 l3 g2 g3.l1

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

我已经尝试用这样的正则表达式来获取这些:

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

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

【问题讨论】:

  • 你能提供一个你想要正则表达式的字符串的实际文本示例和你想要的输出吗?我对你的问题不太了解。

标签: java regex regex-lookarounds regex-group regex-greedy


【解决方案1】:

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

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

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

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

在java中

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

这将匹配

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

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

【讨论】:

  • 可以在不同的组中提取这些吗?我想将第一个结果作为第 1 组,将其他结果作为第 2 组
  • @Sony 您可能会这样做 ^group (\S+)((?: \S+)*) Demo 并可能在空间上拆分组 2。或者在不同的组中(?:^group (\S+)|\G(?!^))\s(\S+)Demo
【解决方案2】:

如果我们希望捕获那些用空格分隔的字母数字,并分别捕获单词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));
    }
}

正则表达式电路

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

【讨论】:

  • 请注意,当group 不存在时,您的模式也将匹配,因为交替将匹配组或不匹配空白字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 2019-08-01
  • 2021-11-05
相关资源
最近更新 更多