当我使用此代码提取项目时,正则表达式不会检测到重复,感谢您的帮助。
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
答案 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));
}
}
这可以正确处理零匹配和多个匹配情况。