2013-03-24 90 views
1

在java中对于像这个表达式(3 + 2)+ 23/12-(43/54)的正则表达式,其中左括号是创建用户将能够把正确的一个如果没有创建左括号,用户将不能输入正确的括号。如果创建了左括号3次,用户将只能右置括号3次来关闭由左括号打开的表达式。Java科学计算器正则表达式

感谢

+4

你应该发布一些代码让我们来帮助你,你有什么尝试? – BackSlash 2013-03-24 11:15:39

+0

我认为这个问题不需要代码,因为问题在括号里,如果左括号“(”在表达式中比你可以放“)”一个如果“(”是3倍或更多比你可以放“)”3倍或更多。 – Hope 2013-03-24 11:20:27

+2

它需要代码,你应该尝试自己做,然后来到这里,告诉我们你的代码中有什么不起作用,所以我们可以帮你找到解决方案 – BackSlash 2013-03-24 11:26:34

回答

4

简而言之,使用标准的正则表达式,这是不可能的。

正则表达式只能匹配所谓的regular languages,并且匹配的嵌套结构需要a more general typeformal language

Can regular expressions be used to match nested patterns?

它,但是,很容易做到,你需要用其他的方法是什么。例如,只需遍历该字符串一次,然后计算括号:+1'('-1')'。计数结束时会告诉您有多少个开括号:如果计数大于零,允许用户添加右括号;否则,不要。

+0

什么是解决这个问题的方法你有任何想法的链接等 – Hope 2013-03-24 11:22:56

+0

谢谢我试试 – Hope 2013-03-24 11:28:46

1

这不是真正的东西,你可以用正则表达式来表达。

你需要一个上下文无关文法。

也见这里:

http://en.wikipedia.org/wiki/Context-free_grammar

下的部分 “良好形成括号”。

+0

那么我应该如何解决这个问题 – Hope 2013-03-24 11:25:36

+0

使用像这样的堆栈写一个小函数: http://newserverside.blogspot.dk/2012/05/check-parentheses -in-string-expression.html 或者写一个递归函数。 – jcmikkelsen 2013-03-24 11:36:42

+0

谢谢你的链接解决了我的问题,谢谢 – Hope 2013-03-24 14:37:56

0

您的最佳选择是使用词法分析器和解析器。在Java世界中,最受欢迎的是ANTLR和JavaCC。

首先在Backus-Naur Form [BNF]中为您的计算器语言建模。然后转换成您选择的词法分析器,并使用解析器来处理结果。