Regex可以处理嵌套操作吗?

时间:2019-02-01 20:38:12

标签: regex algorithm nested

我有一些像这样的字符串:

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

和与一些正则表达式,答案应该是:

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

正则表达式可以这样做吗?

1 个答案:

答案 0 :(得分:6)

如果输入的内容有效,我们可以利用这种语言的一些冗余约束来添加适当的括号。但这实际上更多是使用“技巧”。我真的建议使用更复杂的工具,例如下推自动机(因此是 parser )。

在这里我们可以发现一些东西:也就是说,如果下一个字符是数字,或者是双引号序列,后跟一个数字,则所有其他双引号。

所以我们基本上可以使用两个正则表达式来做到这一点:

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

但是,如果原始输入有效,此技巧有效。如果它在运算符周围包含双引号,例如"+",那么它会产生完全不同的结果。

在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))'

这在这里有效,因为我们只考虑数字和运算符。如果我们要添加变量,它仍然可以工作,但是如果我们添加更复杂的元素(如函数),则问题将变得更加棘手。

“递归语言”(可以根据自身定义某些元素 的语言)可以通过为此专门构造的工具push down automaton进行更好的解析。

pumping lemma for regular languages显示诸如 n n 之类的语言(该语言包含带有多个开括号的字符串,后跟相同数量的右括号),无法使用正则表达式进行验证。您在此处描述的语言就是一个示例。因此,此正则表达式能够验证该正则表达式。某些编程语言(如 Perl )具有扩展的正则表达式,以便它们可以验证平衡括号。这些不是正则表达式,至少不是 Stephen Kleene 所定义的。