我正在尝试拆分此输入:
和(12),和(3,34,23),122
进入这些:
和(12)
和(3,34,23)
122
我有以下代码
pattern = Pattern.compile("^|,|\\G(sum\\(.*\\)|[0-9]+)$|,");
matcher = pattern.matcher(parameter);
while(matcher.find()) {
System.out.println("match: " + matcher.group(1));
}
parameter = calculateFormula(parameter);
然而它匹配
和(12),和(3,34,23)
我该怎样做才能得到我想要的结果。
答案 0 :(得分:3)
使用“?”。例如
String parameter = "sum(12),sum(3,34,23),122";
Pattern pattern = Pattern.compile("(sum\\(.*?\\)|[0-9]+)");//
Matcher matcher = pattern.matcher(parameter);
while (matcher.find()) {
System.out.println("match: " + matcher.group(1));
}
将打印:
match: sum(12)
match: sum(3,34,23)
match: 122
答案 1 :(得分:0)
这个正则表达式怎么样:
,(?![^\(\)]*\))
,
查找逗号
(?!...)
是一个负面的展望。 “将尝试从这个位置匹配它的内容。如果成功,则前瞻失败。如果失败,则前瞻成功。它将在匹配后恢复光标位置。”
`[^ ...]一个否定的字符类。匹配除里面的字符之外的任何字符。
\(\)
分别转义'('和')'运算符,以便正则表达式将它们理解为字符。
*
贪婪的中继器。寻找一些东西,直到它停止发生。在这种情况下,它匹配所有不是括号的字符,直到找到括号。
\)
转义操作符现在被视为一个字符。
用英语写的正则表达式会说:
查找与非括号文本不匹配的逗号 在它之后的括号。
答案 2 :(得分:0)
您的问题是因为.*
中的sum\\(.*
是贪婪的,并且与“12),sum(3,34,23
”匹配。
您可以通过将其更改为非贪婪的匹配.*?
来修复它。
然而,就个人而言,我会选择一些非常简单的事情,例如:
"\\w+\\(.*?\\)|[^,]+"
...意思是“贪婪地匹配任何单词,然后用括号中的少量内容,或者失败,任何一个或多个不是逗号的东西的贪婪字符串”。
否则,问题会变得更加复杂“分裂在任何未包含在parens中的逗号”,这将涉及前瞻性断言和所有种类,并且如果你可以像嵌套的parens一样迅速成为一个巨大的混乱sum(3,sum(34,23),4)
,或者如果你不能假设匹配的parens,等等。
如果你正在走这条路,我的建议通常是在非字符边界上进行标记,并分成:
'sum' '(' '12' '),' 'sum' '(' '3' ',' '34' ',' '23' ')' ',' '122'
...然后在状态机中依次处理每个令牌。