在java中使用正则表达式进行拆分

时间:2013-07-13 22:16:38

标签: java regex split

我正在尝试拆分此输入:

  

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

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

3 个答案:

答案 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'

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