【问题标题】:Getting match of Group with Asterisk?用 Asterisk 获得 Group 的匹配?
【发布时间】:2014-11-09 14:06:07
【问题描述】:

如何获取带有星号的组的内容?

例如,我想删除一个逗号分隔的列表,例如。 G。 1,2,3,4,5.

private static final String LIST_REGEX = "^(\\d+)(,\\d+)*$";
private static final Pattern LIST_PATTERN = Pattern.compile(LIST_REGEX);

public static void main(String[] args) {
    final String list = "1,2,3,4,5";
    final Matcher matcher = LIST_PATTERN.matcher(list);
    System.out.println(matcher.matches());
    for (int i = 0, n = matcher.groupCount(); i < n; i++) {
        System.out.println(i + "\t" + matcher.group(i));
    }
}

输出是

true
0   1,2,3,4,5
1   1

我怎样才能得到每一个条目,我。 e. 1, 2, 3, ...?

我正在寻找一个通用的解决方案。这只是一个示范性的例子。
请想象一个像^\\[(\\d+)(,\\d+)*\\]$ 这样更复杂的正则表达式来匹配像[1,2,3,4,5] 这样的列表

【问题讨论】:

  • 对于您的第二个示例,最简单的应该是使用正则表达式来获取 [] 和使用拆分后之间的内容。使用正则表达式会降低效率。

标签: java regex string capturing-group


【解决方案1】:

您可以使用String.split()。

for (String segment : "1,2,3,4,5".split(","))
    System.out.println(segment);

或者你可以用断言重复捕获:

Pattern pattern = Pattern.compile("(\\d),?");
for (Matcher m = pattern.matcher("1,2,3,4,5");; m.find())
     m.group(1);

对于您添加的第二个示例,您可以进行类似的匹配。

for (String segment : "!!!!![1,2,3,4,5] //"
                          .replaceFirst("^\\D*(\\d(?:,\\d+)*)\\D*$", "$1")
                          .split(","))
    System.out.println(segment);

我做了一个online code demo。我希望这是你想要的。


如何获得带有星号(xyz)* 的任意组的所有匹配项(零个、一个或多个)? [该组被重复,我希望每次重复捕获。]

不,你不能。 Regex Capture Groups and Back-References 说明原因:

给定组的返回值是最后一个捕获的

由于带有量词的捕获组保留其编号,当您检查该组时引擎会返回什么值? 所有引擎都返回最后捕获的值。例如,如果您将字符串 A_B_C_D_ 与 ([A-Z]_)+ 匹配,当您检查匹配时,第 1 组将是 D_。除 .NET 引擎外,所有中间值都将丢失。 实质上,第 1 组每次匹配其模式时都会被覆盖。

【讨论】:

  • 谢谢。因为这个例子是你的解决方案最简单的方法,但这是一个更常见的问题。
  • @Vertex 常见问题是什么?是要匹配列表中逗号之间的数字,还是要匹配所有数字?
  • 常见的问题是如何处理带有星号的组:(xyz)*?定义说,正则表达式xyz 可以出现零次、一次或多次。我想得到所有的比赛。在上面的 special 列表示例中,这意味着,我想要获得所有这些匹配项:1、2、3、...对于(,\\d+)*。我投票 +1 是因为其他人可能会搜索这个 special 问题,但我不是 :)
  • @Vertex 您不能将量词中和为捕获。在匹配中重复捕获组时,只会记住最后一个匹配。我将更新我的答案并解释这是怎么回事。
【解决方案2】:

我假设您可能正在寻找类似以下的内容,这将处理您的两个示例。

private static final String LIST_REGEX = "^\\[?(\\d+(?:,\\d+)*)\\]?$";
private static final Pattern LIST_PATTERN = Pattern.compile(LIST_REGEX);

public static void main(String[] args) {
    final String list = "[1,2,3,4,5]";
    final Matcher matcher = LIST_PATTERN.matcher(list);

    matcher.find(); 
    int i = 0;

    String[] vals = matcher.group(1).split(",");

    System.out.println(matcher.matches());
    System.out.println(i + "\t" + matcher.group(1));

    for (String x : vals) {
       i++;
       System.out.println(i + "\t" + x);
    }
}

输出

true
0   1,2,3,4,5
1   1
2   2
3   3
4   4
5   5

【讨论】:

  • 我投了 +1 票,因为其他人可能会搜索这个特殊问题,而您可以解决它。但我不接受答案,因为我想知道如何获得带有星号 (xyz)* 的任意组的所有匹配项(零个、一个或多个)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多