如何使用正则表达式从线性表达式的特定部分提取运算符

时间:2014-09-21 03:17:24

标签: java regex

我有一个线性表达式,我必须从特定的地方提取运算符。我不需要提取所有的运算符。我的表达式是

c*(a+b)+(a-b)/log(a+b)-(b-c/d)+(d-tan90)

支架内的操作员不需要分开。只有两个元素之间的运算符才能分开。即我想要的输出是

*,+,/, - ,+  有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

假设没有嵌套括号,您可以通过删除不需要的字符序列来完成此操作。您不需要的字符序列是:

  • (开头且以);
  • 结尾的任何序列
  • 不是运营商的任何其他角色。

您可以使用replaceAll删除所有这些序列。此语句会将operators设置为包含所有已移除的字符串,即"*+/-+"

operators = inputString.replaceAll("\\([^)]*\\)|[^-+*/]", "");

这导致任何序列由(组成,后跟零个或多个非)个字符,然后)替换为"";它还会导致任何不是-+*/的字符替换为""。首先测试第一个替代方案,因此第二个替代方案仅影响不在括号中的字符。请注意,[^-+*/]中的连字符首先出现在任何其他字符之前,因此-不会被解释为指示一系列字符。

如果有嵌套括号,则不要使用正则表达式。 Java中的正则表达式无法处理嵌套构造。 (我认为有些语言支持处理它们的正则表达式功能,但不支持Java。至少不是标准的Java运行时。可能有某个第三方Java库支持它。)azurefrog的答案是最好的方法。

注意:现在已经过测试。

答案 1 :(得分:1)

如果您真正需要的只是运算符,我认为表达式解析器是过度的。

只需遍历字符并存储运算符即可。唯一(次要)复杂性是跟踪括号的数量。

此代码段将为您提供所需的输出,如果您最终使用嵌套表达式,也会有效:

    String expression = "c*(a+b)+(a-b)/log(a+b)-(b-c/d)+(d-tan90)";
    List<Character> operators = new ArrayList<Character>();
    int parentheses = 0;
    for (char c : expression.toCharArray()) {
        // throw away everything inside ( )
        if (c == '(') {
            parentheses++;
        } else if (c == ')') {
            parentheses--;
        }
        if (parentheses > 0) {
            continue;
        }

        // store operators outside ( )
        if (c == '+' || c == '-' || c == '*' || c == '/') {
            operators.add(c);
        }
    }
    System.out.println(operators);  // [*, +, /, -, +]

请注意,我假设你正在研究一个有效的数学表达式。如果您不确定自己是否能获得良好的输入,则需要对其进行验证。

如果你打算做更好的事情,你可能想要使用表达式解析器(例如JepFormula4J)。