我问这个问题是因为我注意到不同语言之间的 RegEx 语法存在一些细微差别。
我想知道某处是否维护了 RegEx 标准?如果是这样,我在哪里可以找到这份文件?此外,如果我在 .NET 中创建 RegEx 表达式,是否保证相同的表达式 100% 兼容并与其他语言(例如 Perl、Javascript 或 Java)一起使用?
最后,在使用 RegEx 时是否有任何“最佳实践”可以帮助使其在其他平台语言中更易于维护?
我问这个问题是因为我注意到不同语言之间的 RegEx 语法存在一些细微差别。
我想知道某处是否维护了 RegEx 标准?如果是这样,我在哪里可以找到这份文件?此外,如果我在 .NET 中创建 RegEx 表达式,是否保证相同的表达式 100% 兼容并与其他语言(例如 Perl、Javascript 或 Java)一起使用?
最后,在使用 RegEx 时是否有任何“最佳实践”可以帮助使其在其他平台语言中更易于维护?
最古老的标准化正则表达式集之一是 POSIX BRE(基本正则表达式)和 ERE(扩展正则表达式),记录在正则表达式 下。
其他语言可能会定义自己的标准。例如,C++ 2011 在第 28 条(大约 46 页标准)中定义了一个正则表达式库。 Perl定义了它的正则表达式。其他语言从这些来源和其他来源借用。Lex 和 Flex 使用它们自己的一组正则表达式。Sed 在正则表达式上使用它自己的变体。Java、JavaScript 和……定义了它们自己的版本,有时使用PCRE(Perl 兼容的正则表达式)作为他们设计的基础。一些细节受到使用正则表达式的语言所提供的设施的影响。
Jeff Friedl 的《掌握正则表达式》一书涵盖了许多不同的正则表达式集,确定了哪些是常见的,哪些是不同的。
不,没有这样的标准。当然还有 PCRE,POSIX BRE,POSIX ERE,...
但实际上任何语言都会有“小”差异。对于大多数风格,您可以传递非常基本的东西,例如.
任何字符或量词+*?
,字符类也很常见,但它已经从预定义的类开始,例如\w
,它是否支持?还是基于 ASCII 或 Unicode?
一个很好的帮助是Jan Goyvaerts对正则表达式信息的风味比较。
最佳实践
positive-negative lookbehinds
在某些情况下避免使用andlookaheads