-1

到目前为止,我已经有了这个正则表达式,可以通过拆分和删除空格将我的字符串拆分为一个字符串数组,还可以按运算符拆分,但保留运算符并插入到同一个数组中。

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]=+;

请任何人帮助解决这个正则表达式问题。

4

3 回答 3

0

拆分....我使用以下正则表达式进行了尝试:

\s*(?=[^0-9.]+)\s*

在下一个字符不是数字(带小数)的任何点上拆分。您可能必须对数字是否可以为负数保持警惕(无论如何这都需要改变您的数据格式)

编辑:我在 perl 中对其进行了测试...

于 2013-04-30T12:05:42.290 回答
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"));
}

它比怪异的正则表达式更清晰、更容易理解。

于 2013-04-30T12:19:44.273 回答
0

这对我有用:

tokens = rpn.replaceAll("(?=\\p{Punct})|(?<=\\p{Punct})", " ").split("\\s+");

这会在标点符号周围添加空格,然后在该空格上拆分。如果您愿意,您可以\\p{Punct}用更具体的标点符号集替换,例如[-+*/()]您的示例中的。

于 2013-04-30T13:00:15.163 回答