如何为逗号分隔符列表创建java正则表达式
(3) (3,6) (3,6)
我试过,但它与任何东西都不匹配:
Pattern.compile("\\(\\S[,]+\\)")
如何在Matcher类的代码中获取值“3”或“3”和“6”?
答案 0 :(得分:2)
我不清楚你输入的确切内容,但我怀疑你使用的模式是你想要的。您的模式将匹配文字(
,后跟一个非空白字符,后跟一个或多个逗号,后跟文字)
。
如果你想匹配一个数字,可选地后面跟一个逗号和另一个数字,所有数字都被括号括起来,你可以试试这个模式:
"\\(\\s*(\\d+)\\s*(,\\d+)?\\s*\\)"
应与(3)
,( 3 )
,( 3, 6)
等匹配,但不是 (a)
或(3, a)
。
您可以使用Matcher.group
检索匹配的数字;第一个数字将是组1
,第二个数字(如果有)将是组2
。
答案 1 :(得分:1)
为了清晰起见,您可以尝试这种元正则表达式方法:
String pattern =
"< part (?: , part )* >"
.replace("<", "\\(")
.replace(">", "\\)")
.replace(" ", "\\s*")
.replace("part", "[^\\s*(,)]++");
System.out.println(pattern);
/*** this is the pattern
\(\s*[^\s*(,)]+\s*(?:\s*,\s*[^\s*(,)]+\s*)*\s*\)
****/
part
模式是[^\s(,)]+
,即除了空格,括号和逗号之外的任何内容中的一个或多个。此构造称为否定字符类。 [aeiou]
匹配5个元音字母中的任何一个; [^aeiou]
匹配所有内容(包括辅音,但也包括数字,符号,空格)。
+
重复也被++
占有优势。 (?:...)
构造是非捕获组,也用于优化。
java.util.regex.Pattern
然后我们可以按如下方式测试模式:
String[] tests = {
"(1,3,6)",
"(x,y!,a+b=c)",
"( 1, 3 , 6)",
"(1,3,6,)",
"(())",
"(,)",
"()",
"(oh, my, god)",
"(oh,,my,,god)",
"([],<>)",
"( !! , ?? , ++ )",
};
for (String test : tests) {
if (test.matches(pattern)) {
String[] parts = test
.replaceAll("^\\(\\s*|\\s*\\)$", "")
.split("\\s*,\\s*");
System.out.printf("%s = %s%n",
test,
java.util.Arrays.toString(parts)
);
} else {
System.out.println(test + " no match");
}
}
打印:
(1,3,6) = [1, 3, 6]
(x,y!,a+b=c) = [x, y!, a+b=c]
( 1, 3 , 6) = [1, 3, 6]
(1,3,6,) no match
(()) no match
(,) no match
() no match
(oh, my, god) = [oh, my, god]
(oh,,my,,god) no match
([],<>) = [[], <>]
( !! , ?? , ++ ) = [!!, ??, ++]
在修剪括号后,使用String.split
获取所有部分的String[]
。