0

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

我更喜欢java中的解决方案,但如果它是另一种语言,我也可以弄清楚。

4

2 回答 2

1

您可能想使用递归下降解析器这是一篇文章和一些示例代码,尽管第一个链接中的维基百科文章有一些很好的示例 C 代码。

递归下降解析器还有其他替代方案,例如operator-precedence parser,但我在本科生的经验是使用递归下降解析器(从那时起我没有解析任何数学表达式)。无论哪种方式,您本质上都是按照运算符优先级的顺序解析数学表达式。

于 2013-04-11T02:34:03.537 回答
0

您可以使用 Java 的 PCRE 库来实现这一点。

PCRE 的这个特性称为递归模式(参见文档):

$ 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)"
  }
}
于 2013-04-11T03:45:14.807 回答