如何匹配不在括号中的字符?表达式也可以有任意数量的嵌套括号。换句话说,我想((2+3)*10)-((10+1)/2)
分成((2+3)*10)
and ((10+1)/2)
。如果可能的话,我想用正则表达式来做到这一点。我需要知道如何做到这一点,因为我正在解析类似数学的表达式,所以如果这不是要走的路,我该怎么办?
我更喜欢java中的解决方案,但如果它是另一种语言,我也可以弄清楚。
您可能想使用递归下降解析器。 这是一篇文章和一些示例代码,尽管第一个链接中的维基百科文章有一些很好的示例 C 代码。
递归下降解析器还有其他替代方案,例如operator-precedence parser,但我在本科生的经验是使用递归下降解析器(从那时起我没有解析任何数学表达式)。无论哪种方式,您本质上都是按照运算符优先级的顺序解析数学表达式。
您可以使用 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)"
}
}