我想知道你是否提供赏金。
正则表达式中的简单递归是一个带有合格/不合格返回的gosub,它恰好是可堆叠的。
下面是一个Perl例程,它为您指定的简单操作符和简单语法规则传递Perl自己的解析algol。这是在一个正则表达式中完成的,因为你的需求非常简单。
它看起来很花哨,但解决了'()'的简单平衡文本。它看起来像Dot Net
可以做到这一点。它应该是真正容易的只是做替代的(即;(?& var)),做
平衡分组DotNet需要...即时验证。
我发布这个,因为,嵌套不是问题。问题是,像
解析似乎简单,魔鬼是在细节。
^
(?:
^(?&sign)? (?&number)
|
(?&operator)
(?<!^(?:\/|\*))
(?<!^[*]{2})
(?&sign)? (?&number)
|
(?: (?&operator)
(?<!^(?:\/|\*))
(?<!^[*]{2})
(?<! [(] (?:\/|\*))
(?<! [(] [*]{2})
(?&sign)?
|
(?<= [(])
|
^(?&sign)?
)
(?<term>
\(
(?:
(?> (?&sign)?
(?&number)
(?: (?&operator) (?&sign)? (?&number))*
)
|
(?>
(?: (?<= [(]) | (?&operator))
(?<! [(] (?:\/|\*))
(?<! [(] [*]{2})
(?&sign)?
(?&term)
)
)*
\)
(?! [(])
(?> (?&operator) (?&sign)? (?&number))*
)
)*
$
(?(DEFINE)
(?<number> \d+(?:\.\d+)? )
(?<sign> [+-] )
(?<operator>
(?: [*]{2}
| [\/*]
| (?<pm>[-+]) (?! \k<pm>))
)
)
输出
passed ''
passed '(6**-2**3)'
passed '6-+2'
passed '-(-(8*((2)/3)))'
passed '-((8*((2)/3)))'
passed '-((8*((2**4)/3)))'
passed '-((8*((2**4)/3)))**((-1)*(8*((2**4/99)/3)))'
passed '-((8*((2**4)/3)))**((-1)*(8*((2**-4/99)/3)))'
passed '-((8*((2**4)/3)))**-((-1)*(8*((2**-4/99)/3)))'
passed '((8*((2)/3)))'
passed '((8*((2)/3)))'
passed '+((8*((-2)/-3)))'
passed '8-6*2'
passed '-8-6*2'
passed '((8*((2-(8*(8+6)/2))/3))-7*2/234)+8/2*1'
passed '-(8*(8+6)/2)'
passed '(9*9/9)'
passed '(9*(9)/9*(9*(9)/9)*1)'
passed '(9*(9)/9*(9*(9)/9))*(9*(9)/9*(9*(9)/9))'
failed '(6--2)'
failed '-(/(8*((2)/3)))'
failed '-((8*((2(6))/3)))'
failed '+((8*((+2)/--3)))'
failed '+((8*((+2)/--3+)))'
failed '+((8*((*2)/--3)))'
failed '+((8*((*2)/-3)))'
failed '-((8*((-2)/+-3)))'
failed '+8/2(1)'
failed '-(8)*(8/('
failed '-(8)*(8/()'
failed '*(9*9/9)'
failed '*(9*(9)/9*(9*(9)/9))*(9*(9)/9*(9*(9)/9))'
failed '/(9*(9)/9*(9*(9)/9))*(9*(9)/9*(9*(9)/9))'
来源
2012-08-13 00:45:31
sln
不,你不能使用正则表达式这一点。写一个小解析器。 – leppie
您正在使用哪种正则表达式引擎?这只能用支持递归的正则表达式来完成。NET或Perl,即使如此,这将是一个非常毛茸茸的正则表达式。 –
真正的解析器将会更加可维护。 – Ashe