如何匹配括号内的字符?表达式也可以具有任意数量的嵌套括号。换句话说,我想将((2+3)*10)-((10+1)/2)
分为((2+3)*10)
和((10+1)/2)
。如果可能的话,我想用正则表达式来做这件事。我需要知道如何做到这一点,因为我正在解析类似数学的表达式,所以如果不是这样的话,我该怎么办?
我更喜欢java中的解决方案,但如果是另一种语言,我也可能会想出来。
答案 0 :(得分:1)
您可能想要使用recursive descent parser。 Here is an article and some example code,虽然来自第一个链接的维基百科文章有一些很好的C代码示例。
还有递归下降解析器的替代方法,例如operator-precedence parser,但我从undergrad的经验是使用递归下降解析器(从那以后我没有解析任何数学表达式)。无论哪种方式,您实际上都是按运算符优先顺序解析数学表达式。
答案 1 :(得分:0)
您可以使用PCRE库实现此目的。
PCRE的此功能称为RECURSIVE PATTERNS(See documentation):
$ pcretest
PCRE version 8.31 2012-07-06
re> / (?: \( (?: [^()]++ | (?R) )* \) ) /xg
data> ((2+3)*10)-((10+1)/2)
0: ((2+3)*10)
0: ((10+1)/2)
我不懂Java,但在PHP中它以这种方式工作:
$ php -a
Interactive shell
php > preg_match_all('/ (?: \( (?: [^()]++ | (?R) )* \) ) /x', '((2+3)*10)-((10+1)/2)', $r); var_dump($r);
array(1) {
[0]=>
array(2) {
[0]=>
string(10) "((2+3)*10)"
[1]=>
string(10) "((10+1)/2)"
}
}