为什么Matcher.group()无法检测到重复?

时间:2011-12-08 21:42:28

标签: java regex validation

当我使用此代码提取项目时,正则表达式不会检测到重复,感谢您的帮助。

public static void main(String[] args) {
    String input = "item1  , item2  , item3 , item4 ";
    String regex = "\\s*([a-z]\\w+)(\\s*,\\s*([a-z]\\w+))*\\s*";
    System.out.println(input.matches(regex));
    Pattern pat = compile(regex);
    Matcher m = pat.matcher(input);
    m.find();
    for (int i = 0; i < m.groupCount(); i++) {
        System.out.println(m.group(i));
    }
}

输出:

true
item1  , item2  , item3 , item4 
item1
 , item4

我期待看到:

true
item1  , item2  , item3 , item4 
item1
,item2    
,item3
,item4 

4 个答案:

答案 0 :(得分:3)

为什么不使用split

String[] items = input.split(", ");
for (String s : items) {
    System.out.println(s);
}

如果我理解正确,您想要提取输入字符串中的项目。由于它们是用空格,逗号或两者的组合分隔的,因此您可以使用正则表达式“,”作为split方法的参数来简单地拆分它们,并且这些项目将被存储在返回的String[]

答案 1 :(得分:2)

正则表达式的重复部分不在捕获的组中。试试这个:

String regex = "\\s*([a-z]\\w+)((?:\\s*,\\s*([a-z]\\w+))*)\\s*";

答案 2 :(得分:1)

我觉得Java可以做不同数量的捕获变量。它将匹配作为一个整体正确地使用分组,但会覆盖任何捕获缓冲区重复。这是典型的PCRE型引擎。 Dot Net可以做得很好。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Main
{
public static void main(String[] args) {
    String input = "item1  , item2  , item3 , item4 ";
    String regex = "^\\s*([a-z]\\w+)\\s*,\\s*([a-z]\\w+)\\s*,\\s*([a-z]\\w+)\\s*,\\s*([a-z]\\w+)\\s*$";
    Pattern pat = Pattern.compile(regex);
    Matcher m = pat.matcher(input);
    m.find();
    for (int i = 1; i <= m.groupCount(); i++) {
        System.out.println(m.group(i));
    }
    System.out.println("----------");
    regex = "^\\s*([a-z]\\w+)(?:\\s*,\\s*([a-z]\\w+))*\\s*$";
    pat = Pattern.compile(regex);
    m = pat.matcher(input);
    m.find();
    for (int i = 1; i <= m.groupCount(); i++) {
        System.out.println(m.group(i));
    }
}
}


Output:

item1
item2
item3
item4
----------
item1
item4

答案 3 :(得分:0)

Matcher.find方法返回boolean,表示是否匹配。你应该有一个外循环检查它:

while (m.find()) {
  for (int i = 0; i < m.groupCount(); i++) {
    System.out.println(m.group(i));
  }
} 

这可以正确处理零匹配和多个匹配情况。

参考:Lesson: Regular Expressions