我知道有很多正则表达式帖子,但我无法准确找到我需要的内容。我正在创建一个计算器应用程序,为此我有一个方程,我需要根据方程中存在的运算符进行标记。
例子:
"123x849-302+450" -> ["123", "849", "302", "450"]
"124x(145+301)x402+(-402)" -> ["124", "145+301", "402", "-402"]
"124x((234+403)/354))+(-21)" -> ["124", "(234+403)/354", "-21"]
基本上,如果有括号,我需要获取括号内的令牌,否则就根据运算符拆分。
我对正则表达式很不擅长,只知道非常基础的知识。我不知道如何在正则表达式中包含括号,现在,我所拥有的就是:
String delim = "[x+/-]";
String[] tokens = equation.toString().split(delim);
toString 存在是因为 equation 是 StringBuilder。
“常规”语法的概念是一个学术概念。“正则表达式”命名正确:它们可以解析任何“正则”语法,但不能用于解析非正则语法。
让我们将“基础数学”定义为数字、4 个运算符:+-*/
和括号的组合。
“基础数学”不是常规的。
因此它不能用正则表达式解析。
你想要的是一个解析器,可以把这个:
a+x*y+(b-c)*e
进入这个数据结构:
PLUS
/ \
PLUS TIMES
/ \ / \
a TIMES MINUS e
/ \ / \
x y b c
可以使用各种解析器技术,例如递归下降或 Packrat(例如使用 grappa/parboiled 解析器库),以及各种基于 LALR 和 LL(k) 的解析器技术,例如 ANTLR。通常这些是非常复杂的技术;也许对于这种微不足道的事情,您可以为此编写自己的基于递归下降的解析。
但是,回到你原来的问题,如果你想a+x*y+(b-(g+h))*e
分成:['a', 'x', 'y', '(b-(g+h))', 'e'],这只是您需要的一部分,因为现在您仍然需要弄清楚如何处理 '(b-(g+h))' 节点,正则表达式根本无法做到这一点:您希望正则表达式(
在b
作为括号块的开始,然后....你的正则表达式必须计算开括号的数量,然后找到尽可能多的闭括号并忽略它们,然后在那些之后的闭括号获胜。所以,这个正则表达式:
String elementPattern = "(\\([^\\)]+\\)|[^-+*/\\(\\)]+)";
Pattern p = Pattern.compile("^\\s*" + elementPattern + "(\\s*[-+*/]\\s*" + elementPattern + ")*$");
乍一看似乎可以完成这项工作,但实际上并不能完成这项工作:它会停止考虑2 个关闭括号(b-(g+h))
中的第一个部分,因此无法匹配。它需要在第二个停止,但正则表达式没有任何方法可以做到这一点,因为那不是“常规”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句