Java正则表达式分组和+运算符(获取组的多个值)

时间:2013-10-17 17:40:41

标签: java regex

我想知道是否有可能在java正则表达式上使用+运算符获取组的所有匹配。

示例代码:

public static void main(String[] args) {

    String input = "Start: First match, second match, third match.";
    Pattern p = Pattern.compile("Start:\\s*(([\\w\\s]+),?\\s*)+.");

    Matcher m = p.matcher(input);

    while (m.find()) {
        System.out.println("Regular expression Match: "+ m.group(0));
        System.out.println("Group 1: "+ m.group(1));
        System.out.println("Group 2: "+ m.group(2));
    }

}

输出:

Regular expression Match: Start: First match, second match, third match.
Group 1: third match
Group 2: third match

尽管第2组匹配3次“第一场比赛”,“第二场比赛”,“第三场比赛”由于正则表达式上的第二个“+”运算符,我们只能访问match.group(2)中的最后一个。

我的问题是:

¿有一种方法可以在该表达式上访问组2的其他命中,或者当+运算符导致组上的多个匹配时,只有最后一个可以加入?。

感谢。

4 个答案:

答案 0 :(得分:2)

正如其他答案所述,你不能像这样使用+来匹配 n 组。

但是,如果您希望在Java中解决此问题,那么使用Scanner打破分隔符可能有所帮助:

    String input = "Start: First match, second match, third match.";
    Pattern p = Pattern.compile("Start:|\\s*,");

    Scanner s = new Scanner(input).useDelimiter(p);
    while (s.hasNext()) {
        System.out.println("Matched: " + s.next());
    }

打印出来:

Matched:  First match
Matched:  second match
Matched:  third match.

答案 1 :(得分:0)

你问:

There exist a way to access the other hits of the group 2 on that expression or when a + operator causes multiple match on a group only the last one can be accesed?.

答案为否,如果同一组多次匹配某些文本,则您只能访问最后匹配的文本。

当然还有其他方法可以返回多个匹配。

答案 2 :(得分:0)

我认为你的正则表达式可能无法做到这一点。

根据docs

  

与组关联的捕获输入始终是子序列   该组最近匹配。如果一组被评估一秒   时间因为量化然后是先前捕获的值,如果   如果第二次评估失败,将保留任何。匹配   字符串“aba”对表达式(a(b)?)+,例如,离开   第二组设为“b”。所有捕获的输入在开始时被丢弃   每场比赛。

答案 3 :(得分:0)

与大多数其他正则表达式一样,Java不会保存重复组的中间捕获。但是这个功能并不像想象的那么有用。例如,.NET flavor为此提供了CaptureCollection类,但您仍然必须编写代码来循环它。这并不是什么大不了的事,但通常情况下,使用多个匹配通常更容易,就像其他响应者建议的那样。试试这个正则表达式:

"(?:Start:|\\G,)\\s*([\\w\\s]+)"

\G是一种锚点,它使正则表达式拒绝任何不能在最后一个匹配结束时准确开始的匹配。如果 之前没有匹配(即,这是第一次匹配尝试),它就像\A一样,只在字符串的最开头匹配。这就是为什么我将,放在正则表达式的那一部分的原因;我认为假设字符串不以逗号开头是安全的。

请注意,第一组是非捕获;你要找的部分总是在'group(1)`。