我有一个线性表达式,我必须从特定的地方提取运算符。我不需要提取所有的运算符。我的表达式是
c*(a+b)+(a-b)/log(a+b)-(b-c/d)+(d-tan90)
支架内的操作员不需要分开。只有两个元素之间的运算符才能分开。即我想要的输出是
*,+,/, - ,+ 有人可以帮忙吗?
答案 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); // [*, +, /, -, +]
请注意,我假设你正在研究一个有效的数学表达式。如果您不确定自己是否能获得良好的输入,则需要对其进行验证。