匹配字符不在嵌套括号中

时间:2013-04-11 02:23:54

标签: java regex parsing

如何匹配括号内的字符?表达式也可以具有任意数量的嵌套括号。换句话说,我想将((2+3)*10)-((10+1)/2)分为((2+3)*10)((10+1)/2)。如果可能的话,我想用正则表达式来做这件事。我需要知道如何做到这一点,因为我正在解析类似数学的表达式,所以如果不是这样的话,我该怎么办?

我更喜欢java中的解决方案,但如果是另一种语言,我也可能会想出来。

2 个答案:

答案 0 :(得分:1)

您可能想要使用recursive descent parserHere 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)"
  }
}