Java - 我的String.split()的正确正则表达式是什么

时间:2013-10-04 14:24:24

标签: java regex string split equation

我将方程式字符串拆分为字符串数组,如下所示:

String[] equation_array = (equation.split("(?<=[-+×÷)(])|(?=[-+×÷)(])"));

现在测试字符串:

test = "4+(2×5)"

结果很好:

test_array = {"4", "+", "(", "2",...}

但是对于测试字符串:

test2 = "(2×5)+5"

我有字符串数组:

test2_array = {"", "(", "×",...}.

那么,问题是为什么在拆分后在数组(之前添加一个空字符串?

4 个答案:

答案 0 :(得分:1)

这实际上是Java正则表达式中已知的行为。

要避免此空结果,请使用此negative lookahead based regex

String[] equation_array = "(2×5)+5".split("(?!^)((?<=[-+×÷)(])|(?=[-+×÷)(]))");
//=> ["(", "2", "×", "5", ")", "+", "5"]

(?!^)的含义是避免在第一行开始分割。

答案 1 :(得分:0)

如果在令牌开始之前,您可以添加不拆分的条件,如

"(?<=[-+×÷)(])|(?<!^)(?=[-+×÷)(])"
               ^^^^^^

答案 2 :(得分:0)

如果要向后看以确保我们不是在字符串的开头,并期待以确保我们不在最后?

"(?<=[-+×÷)(])(?!$)|(?<!^)(?=[-+×÷)(])"

此处^$是字符串指示符的开头和结尾,(?!...)(?<!...)否定前瞻和后瞻。

答案 3 :(得分:0)

  

问题是为什么在拆分后在数组(之前添加一个空字符串?

因为对于输入(2×5)+5,用于分割匹配的正则表达式在字符串开头处是正确的,因为前面是肯定的(?=[-+×÷)(])

(2×5)+5
↖

它在(之前匹配,导致空字符串:""

我的建议是不要使用正则表达式来解析数学表达式,有更合适的算法。