对于它的价值,这里有更多的上下文:
正则表达式被称为“正则”,因为它们与正则语法相关联,而正则语法不能描述(无限数量的)嵌套括号(它们可以描述一堆随机括号,但不能使它们成对匹配)。
理解这一点的一种方法是理解正则表达式可以(模数我将在最后解释的一些细节)转换为确定性有限自动机。这听起来令人生畏,但实际上只是意味着它们可以转换为“规则”列表,其中规则取决于您匹配的内容,并描述您可以匹配的内容。
例如,正则表达式ab*c
可以转换为:
一开始,您只能匹配a
. 然后转到 2。
现在,您可以匹配b
并返回 2,或者匹配c
并返回 3
你完成了!比赛很成功!
那是一个“确定性有限自动机”。
无论如何,有趣的部分是,如果你坐下来尝试做类似的东西来匹配一对括号,你就做不到!尝试一下。你可以通过制定越来越多的规则来匹配一个有限的数字,但是你不能编写一套匹配无限数量的括号的通用规则(我应该补充一点,规则必须是“如果你匹配 X go玩具”)。
现在显然您可以通过各种方式对其进行修改。您可以允许更复杂的规则(例如扩展它们以让您保留括号的数量),然后您可以获得按预期工作的东西。但它不会是常规语法。
鉴于正则表达式以这种方式受到限制,为什么要使用它们而不是更复杂的东西?事实证明,它们是一个甜蜜点——它们可以做很多事情,同时保持相当简单和高效。更复杂的语法(规则种类)可能更强大,但也更难实现,效率问题也更多。
最后的免责声明和承诺的额外细节:实际上,如今许多正则表达式实际上比这更强大(并且不应该真正称为“正则表达式”)。但以上仍然是为什么你不应该为此使用正则表达式的基本解释。
ps jesse 建议的解决方案通过多次使用正则表达式来解决这个问题;这里的论点是针对正则表达式的一次使用。