我将方程式字符串拆分为字符串数组,如下所示:
String[] equation_array = (equation.split("(?<=[-+×÷)(])|(?=[-+×÷)(])"));
现在测试字符串:
test = "4+(2×5)"
结果很好:
test_array = {"4", "+", "(", "2",...}
但是对于测试字符串:
test2 = "(2×5)+5"
我有字符串数组:
test2_array = {"", "(", "×",...}.
那么,问题是为什么在拆分后在数组(
之前添加一个空字符串?
答案 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
↖
它在(
之前匹配,导致空字符串:""
。
我的建议是不要使用正则表达式来解析数学表达式,有更合适的算法。