0

我正在尝试拆分此输入:

总和(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)

我应该怎么做才能得到我想要的结果。

4

3 回答 3

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
于 2013-07-13T22:23:37.343 回答
0

这个正则表达式怎么样:

,(?![^\(\)]*\))

,查找任何逗号

(?!...)是消极的展望。“将尝试从该位置匹配它的内容。如果成功,则预读失败。如果失败,则预读成功。匹配后将恢复光标位置。”

`[^...] 否定字符类。匹配除其中的字符之外的任何字符。

\(\)分别转义 '(' 和 ')' 运算符,以便正则表达式将它们理解为字符。

*贪婪的中继器。寻找某事直到它停止发生。在这种情况下,它匹配所有不是括号的字符,直到找到括号为止。

\)转义运算符现在被视为一个字符。

用英语写的正则表达式会说:

查找与非括号文本不匹配且后面有括号的逗号。

于 2013-07-13T22:32:41.653 回答
0

您的问题是因为.*insum\\(.*是贪婪的,并且匹配所有“ 12),sum(3,34,23”。

您可以通过将其更改为非贪婪匹配来修复它.*?

但是,就个人而言,我会选择非常简单的东西,例如:

"\\w+\\(.*?\\)|[^,]+"

...意思是“贪婪地匹配任何单词,后跟括号中的最少量的东西,或者失败,任何一个或多个不是逗号的东西的贪婪字符串”。

否则,问题会变得更加复杂“拆分任何不包含在括号中的逗号”,这将涉及前瞻断言和各种类型,如果您可以嵌套括号,则迅速变得一团糟sum(3,sum(34,23),4),或者如果你不能假设匹配的括号,等等。

如果您要走那条路,我的建议通常是在非单词字符边界上进行标记,然后拆分为:

'sum' '(' '12' '),' 'sum' '(' '3' ',' '34' ',' '23' ')' ',' '122'

...然后在状态机中依次处理每个令牌。

于 2013-07-13T23:00:06.057 回答