1

我想知道是否有可能在 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

尽管由于 Regexp 上的第二个“+”运算符,第 2 组匹配了 3 次“第一个匹配”、“第二个匹配”、“第三个匹配”,但我们只能访问 match.group(2) 上的最后一个。

我的问题是:

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

谢谢。

4

4 回答 4

2

如其他答案中所述,您无法像这样使用 +匹配n 个组。

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

    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.
于 2013-10-17T18:56:21.603 回答
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?.

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

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

于 2013-10-17T18:41:23.227 回答
0

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

根据文档

与组关联的捕获输入始终是该组最近匹配的子序列。如果由于量化而对组进行第二次评估,则如果第二次评估失败,则将保留其先前捕获的值(如果有)。例如,将字符串“aba”与表达式 (a(b)?)+ 匹配,将第二组设置为“b”。所有捕获的输入在每次匹配开始时都会被丢弃。

于 2013-10-17T18:48:06.110 回答
0

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

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

\G是一种锚,它会导致正则表达式拒绝任何不完全从最后一个匹配结束的地方开始的匹配。如果没有先前的匹配(即,这是第一次匹配尝试),它的行为就像\A并且仅在字符串的最开始处匹配。这就是为什么我把它放在,正则表达式的那一部分的部分原因;我认为假设字符串不以逗号开头是安全的。

请注意,第一组是非捕获的;您要查找的部分将始终位于“组(1)”中。

于 2013-10-17T23:15:39.147 回答