Regex可以处理嵌套操作吗



我有一些字符串,比如:

"1+""2*3"*4"+"5*6""

对于一些正则表达式,答案应该是:

(1+((2*3)*4)+(5*6))

regex能做到这一点吗?

如果输入是有效,我们可以利用这种语言的一些冗余约束来添加适当的括号。但这实际上更多的是使用"伎俩"。我真的建议使用更复杂的工具,比如下推自动机(所以解析器)。

这里有一点我们可以发现:那就是,如果下一个字符是一个数字,或者一个双引号后面跟着一个数字的序列,那么所有其他的双引号。

因此,我们基本上可以使用两个正则表达式来实现这一点:

  • 第一个替换所有后跟零或多个后跟数字的双引号;以及
  • 然后替换所有剩余的双引号(这实际上只是字符替换,因此不需要正则表达式)

但是这个技巧只有在原始输入有效的情况下才有效。如果它在运算符周围包含双引号,比如"+",那么它可以产生完全不同的结果。

例如,在Python中,我们可以使用:

from re import sub
def add_brackets(text):
return sub(r'["](?="*[(d])', '(', text).replace('"', ')')

这就给了我们:

>>> add_brackets('"1+""2*3"*4"+"5*6""')
'(1+((2*3)*4)+(5*6))'

这在这里是有效的,因为我们只考虑数字和运算符。如果我们添加变量,它仍然有效,但如果我们添加更复杂的元素,如函数,那么问题就会变得更困难。

然而,"递归语言"(某些元素可以自己定义的好语言)可以通过为此构建的工具(下推自动机)更好地进行解析。

正则语言的抽运引理表明,像(n)n(一种包含多个开括号的字符串,后面跟着相同数量的闭括号的语言)这样的语言不能用正则表达式来验证。你在这里描述的语言就是一个例子。因此,这个正则表达式不能验证这一点。一些编程语言(如Perl)具有扩展的正则表达式,因此这些正则表达式可以验证平衡括号。这些不是正则表达式,至少不是由Stephen Kleene定义的。

最新更新