问题 跨语言的RegEx标准


我问这个问题,因为我注意到不同语言之间RegEx的语法略有不同。我想知道是否有一个RegEx标准在某处维护?如果是这样,我在哪里可以找到这份文件。另外,如果我在.NET中创建一个RegEx表达式,那么相同的表达式是否保证100%兼容并且可以与其他语言一起使用,例如Perl或Javascript或Java?最后,在使用RegEx时是否有任何“最佳实践”,这有助于使其在其他平台语言中更易于维护?


5009
2017-10-05 04:46


起源



答案:


最古老的标准化正则表达式之一是POSIX BRE(基本正则表达式)和ERE(扩展正则表达式),记录在 常用表达

其他语言可以定义自己的标准。例如,C ++ 2011具有第28节中定义的正则表达式库(约46页标准)。 Perl的 定义其正则表达式。其他语言借鉴这些来源和其他语言。 Lex和Flex使用他们自己的正则表达式。 Sed在正则表达式上使用自己的变体。 Java,JavaScript和...定义了自己的版本,有时使用 PCRE (Perl兼容的正则表达式)作为其设计的基础。一些细节受到使用正则表达式的语言提供的功能的影响。

杰夫弗里德尔的书 掌握正则表达式 涵盖了许多不同的正则表达式,确定了哪些是常见的,哪些是不同的。


12
2017-10-05 05:01



投票给你参考Friedl的书。 - jlmcdonald
杰夫弗里德的书+1。还看看看看 en.wikipedia.org/wiki/Comparison_of_regular_expression_engines 比较。出于大多数实际目的,我希望您的.Net,Java和Perl正则表达式兼容。如果你的正则表达式很复杂,你可能会遇到问题(比如递归)。 - Robert Hanson
JavaScript和Java实现了PCRE的一个子集,JS实现了一个较小的子集。 - nhahtdh


答案:


最古老的标准化正则表达式之一是POSIX BRE(基本正则表达式)和ERE(扩展正则表达式),记录在 常用表达

其他语言可以定义自己的标准。例如,C ++ 2011具有第28节中定义的正则表达式库(约46页标准)。 Perl的 定义其正则表达式。其他语言借鉴这些来源和其他语言。 Lex和Flex使用他们自己的正则表达式。 Sed在正则表达式上使用自己的变体。 Java,JavaScript和...定义了自己的版本,有时使用 PCRE (Perl兼容的正则表达式)作为其设计的基础。一些细节受到使用正则表达式的语言提供的功能的影响。

杰夫弗里德尔的书 掌握正则表达式 涵盖了许多不同的正则表达式,确定了哪些是常见的,哪些是不同的。


12
2017-10-05 05:01



投票给你参考Friedl的书。 - jlmcdonald
杰夫弗里德的书+1。还看看看看 en.wikipedia.org/wiki/Comparison_of_regular_expression_engines 比较。出于大多数实际目的,我希望您的.Net,Java和Perl正则表达式兼容。如果你的正则表达式很复杂,你可能会遇到问题(比如递归)。 - Robert Hanson
JavaScript和Java实现了PCRE的一个子集,JS实现了一个较小的子集。 - nhahtdh


没有这样的标准。当然有PCRE,POSIX BRE,POSIX ERE,......

但事实上,任何语言都会存在“小”差异。对于大多数口味,你可以传递非常基本的东西,比如 . 对于任何角色或量词 +*?,字符类也很常见,但它已经在预定义的类中开始了 \w,它是否受到支持?或基于ASCII还是Unicode?

这里有一个很好的帮助 regular-expressions.info上的味道比较 通过 Jan Goyvaerts


0
2017-10-05 05:56



如果您的语言支持它,为什么要避免这种重要的功能? - Victor Grazi


最佳实践

避免使用 positive-negative lookbehinds 在某些情况下 lookaheads


0
2017-10-05 05:56



你为什么要避免前瞻,只有在某些情况下才能看到后卫?对于所有语言而言,对后向支持的限制远远超过前瞻。 - stema
@stema ohh ...对不起,我在他们之间感到困惑......请指出 - Anirudha