在java中对于像这个表达式(3 + 2)+ 23/12-(43/54)的正则表达式,其中左括号是创建用户将能够把正确的一个如果没有创建左括号,用户将不能输入正确的括号。如果创建了左括号3次,用户将只能右置括号3次来关闭由左括号打开的表达式。Java科学计算器正则表达式
感谢
在java中对于像这个表达式(3 + 2)+ 23/12-(43/54)的正则表达式,其中左括号是创建用户将能够把正确的一个如果没有创建左括号,用户将不能输入正确的括号。如果创建了左括号3次,用户将只能右置括号3次来关闭由左括号打开的表达式。Java科学计算器正则表达式
感谢
简而言之,使用标准的正则表达式,这是不可能的。
正则表达式只能匹配所谓的regular languages,并且匹配的嵌套结构需要a more general type的formal language。
见Can regular expressions be used to match nested patterns?
它,但是,很容易做到,你需要用其他的方法是什么。例如,只需遍历该字符串一次,然后计算括号:+1
为'('
和-1
为')'
。计数结束时会告诉您有多少个开括号:如果计数大于零,允许用户添加右括号;否则,不要。
这不是真正的东西,你可以用正则表达式来表达。
你需要一个上下文无关文法。
也见这里:
http://en.wikipedia.org/wiki/Context-free_grammar
下的部分 “良好形成括号”。
那么我应该如何解决这个问题 – Hope 2013-03-24 11:25:36
使用像这样的堆栈写一个小函数: http://newserverside.blogspot.dk/2012/05/check-parentheses -in-string-expression.html 或者写一个递归函数。 – jcmikkelsen 2013-03-24 11:36:42
谢谢你的链接解决了我的问题,谢谢 – Hope 2013-03-24 14:37:56
您的最佳选择是使用词法分析器和解析器。在Java世界中,最受欢迎的是ANTLR和JavaCC。
首先在Backus-Naur Form [BNF]中为您的计算器语言建模。然后转换成您选择的词法分析器,并使用解析器来处理结果。
你应该发布一些代码让我们来帮助你,你有什么尝试? – BackSlash 2013-03-24 11:15:39
我认为这个问题不需要代码,因为问题在括号里,如果左括号“(”在表达式中比你可以放“)”一个如果“(”是3倍或更多比你可以放“)”3倍或更多。 – Hope 2013-03-24 11:20:27
它需要代码,你应该尝试自己做,然后来到这里,告诉我们你的代码中有什么不起作用,所以我们可以帮你找到解决方案 – BackSlash 2013-03-24 11:26:34