2

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

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

现在测试字符串:

test = "4+(2×5)"

结果很好:

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

但对于测试字符串:

test2 = "(2×5)+5"

我得到了字符串数组:

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

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

4

4 回答 4

1

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

为了避免这个空结果使用这个negative lookahead based regex

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

什么(?!^)意思是避免在行开始时分裂。

于 2013-10-04T14:32:06.473 回答
0

如果之前令牌是字符串的开头,您可以添加不拆分的条件,例如

"(?<=[-+×÷)(])|(?<!^)(?=[-+×÷)(])"
               ^^^^^^
于 2013-10-04T14:32:31.807 回答
0

向后看以确保我们不在字符串的开头,向前看以确保我们不在结尾呢?

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

这里^$是字符串指示符的开始和结束,(?!...)(?<!...)前瞻和后瞻。

于 2013-10-04T14:32:43.213 回答
0

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

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

(2×5)+5
↖

它在 . 之前匹配(,产生一个空字符串:""

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

于 2013-10-04T14:35:33.737 回答