Regex 我可以一直安全地使用扩展正则表达式而不是基本表达式吗?

Regex 我可以一直安全地使用扩展正则表达式而不是基本表达式吗?,regex,Regex,看来,大多数现代语言和工具都允许扩展正则表达式,而且ERE看起来比BRE更干净,带有所有这些反斜杠。当使用ERE而不是BRE时,在兼容性或可维护性方面是否存在任何主要缺陷?在兼容性方面显然存在缺陷,但这显然不会影响您编写的新正则表达式。我总是使用扩展正则表达式。事实上,这是目前大多数正则表达式库的默认设置,因此只需按照流程进行操作。取决于您的环境和受众 BRE越来越少,我认为在这一点上,支持ERE的工具可能比BRE更多。甚至grep(GNU变体)现在也是默认的 大多数所谓的“BRE”实际上并不是

看来,大多数现代语言和工具都允许扩展正则表达式,而且ERE看起来比BRE更干净,带有所有这些反斜杠。当使用ERE而不是BRE时,在兼容性或可维护性方面是否存在任何主要缺陷?

在兼容性方面显然存在缺陷,但这显然不会影响您编写的新正则表达式。我总是使用扩展正则表达式。事实上,这是目前大多数正则表达式库的默认设置,因此只需按照流程进行操作。

取决于您的环境和受众

BRE越来越少,我认为在这一点上,支持ERE的工具可能比BRE更多。甚至grep(GNU变体)现在也是默认的

大多数所谓的“BRE”实际上并不是BRE。如果您将这些函数中的任何一个用作元字符:
|+?
,那么您的BRE实际上是带有BRE转义的

我认为BRE是一个例外,应该避免,除非您的环境中存在需要它的东西

我不认为“BRE vs.ERE”是当今非常有用的区别。还有许多基于ERE的工具,如awk和gnu grep,以及MySQL和Oracle等数据库中的regex支持,但BRE实际上只是一个脚注

此外,大多数现代编程语言中内置的regex风格在功能上远远超出了ERE。即使是功能最差的JavaScript,也支持非捕获组、不情愿的量词和lookaheads。将正则表达式的口味分类为“ERE vs.ECMA+”可能会更有帮助,但它的意义远不止于此

如果您在Tcl中编程,您可以使用
\y
\m
来匹配单词边界;在JavaScript中,你会爱上
[\s\s]
,因为没有点匹配换行符模式;在Visual Studio中,您使用
@
#
而不是
*?
+?
进行最小匹配。而且,尽管Java具有完全现代的正则表达式风格,但它没有正则表达式文本,也没有原始/文本/逐字字符串表示法,所以不管怎样,你都看不到所有的反斜杠

实际上,这并不是你必须做出的选择。一旦决定使用哪种工具,就可以使用它所需要的任何正则表达式风格


参考: