2012-10-05 97 views
10

我在问这个问题,因为我注意到RegEx在不同语言之间的语法有些细微的差异。我想知道是否有一个RegEx标准被维护在某个地方?如果是这样,我在哪里可以找到这份文件。另外,如果我在.NET中创建RegEx表达式,是否保证与100%兼容的表达式以及其他语言(如Perl,Javascript或Java)一起工作?最后,在使用正则表达式时,是否有任何“最佳实践”可以帮助使其在其他平台语言中更易于维护?不同语言的RegEx标准

回答

11

一个最老的集标准化的正则表达式的是POSIX BRE(基本正则表达式)和ERE(扩展正则表达式),Regular Expressions下记录。

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

杰夫·弗里德的书Mastering Regular Expressions涵盖了很多套不同的正则表达式的,确定什么是共同的,什么是不同的。

+0

投票您的参考弗里德尔的书。 – jlmcdonald

+3

Jeff Friedl的书+1。还可以看看http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines进行比较。对于大多数实际用途,我期望您的.Net,Java和Perl正则表达式可以兼容。如果你的正则表达式很复杂,你可能会遇到问题(如递归)。 –

+0

JavaScript和Java实现了PCRE的一个子集,JS实现了一个较小的子集。 – nhahtdh

0

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

但实际上会有任何语言的“小”的差别。您可以在转播非常基本的东西对大多数口味,像.任意字符或量词+*?,字符类也很常见,但它已经开始在预定义类,如\w,是它支持呢?或基于ASCII或Unicode?

一个很好的帮助这里是flavor comparison on regular-expressions.info通过Jan Goyvaerts

0

最佳实践

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

+0

为什么你会避免向前看,只有在某些情况下向后看?对于所有语言来说,后向支持的限制比预见更多。 – stema

+0

@stema ohh ...对不起,我在他们之间感到困惑..thx指出 – Anirudha