到目前为止,我已经有了这个正则表达式,可以通过拆分和删除空格来将我的字符串拆分成字符串数组,并且还可以通过运算符进行拆分,但保留运算符并插入到相同的数组中。
tokens = rpn.split("(?<=\\s) |(?=\\s) |(?>\\s+) |(?<=[-+*/()])|(?=[-+*/()])|(?>=[-+*/()])");
E.g. input 2 3 + OR 2 3+;
output a[0]=2;a[1]=3;a[2]=+
这是一个RPN计算器,用于删除所有空格和单独的数字和运算符。
以上正则表达式可用于拆分数字和运算符e.g. 3+ into 3 + but if I have 2 3 +
然后输出为tokens[0]=2; tokens[1]=3;tokens[2]="";tokens[3]=+;
请任何人帮助解决此正则表达式问题。
答案 0 :(得分:0)
拆分....我用以下正则表达式尝试了它:
\s*(?=[^0-9.]+)\s*
在下一个字符不是数字(带小数)的任何点上拆分。您可能必须聪明地判断数字是否为负数(无论如何都需要更改数据格式)
编辑:我在perl中测试过它......
答案 1 :(得分:0)
如果我理解正确,你就可以像这样进行分裂。
public String[] split(String text) {
ArrayList<String> a = new ArrayList<String>();
Matcher matcher = Pattern.compile("(\\d+|[\\+\\-*/])").matcher(text);
int idx = 0;
while (matcher.find(idx)) {
a.add(matcher.group());
idx = matcher.end();
}
return a.toArray();
}
public void testSplit() {
Assert.assertArrayEquals(new String[] {"3", "+", "5", "*", "3", "-", "4"},
split("3 + 5 * 3-4"));
}
它比喧闹的正则表达更清晰,更容易理解。
答案 2 :(得分:0)
这对我有用:
tokens = rpn.replaceAll("(?=\\p{Punct})|(?<=\\p{Punct})", " ").split("\\s+");
这会在标点符号周围添加空格,然后在该空格上分割。您可以使用更具体的标点符号替换\\p{Punct}
,例如,如果您愿意,可以使用示例中的[-+*/()]
。