使用Asterisk获得Group的匹配?

时间:2014-09-15 23:19:21

标签: java regex string capturing-group

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

例如,我想削减以逗号分隔的列表,例如: 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

我怎样才能获得每一个条目,i。即123,...?

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

之类的列表

2 个答案:

答案 0 :(得分:4)

您可以使用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组都会被覆盖。

答案 1 :(得分: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