【问题标题】:RegEx standards across languages跨语言的 RegEx 标准
【发布时间】:2012-10-05 04:46:07
【问题描述】:

我问这个问题是因为我注意到不同语言之间的 RegEx 语法存在一些细微差别。

我想知道某个地方是否维护了 RegEx 标准?如果是这样,我在哪里可以找到这份文件?此外,如果我在 .NET 中创建 RegEx 表达式,是否保证相同的表达式 100% 兼容并与其他语言(例如 Perl、Javascript 或 Java)一起使用?

最后,在使用 RegEx 时是否有任何“最佳实践”可以帮助使其在其他平台语言中更易于维护?

【问题讨论】:

    标签: regex


    【解决方案1】:

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

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

    Jeff Friedl 的书 Mastering Regular Expressions 涵盖了许多不同的正则表达式集,确定了哪些是常见的,哪些是不同的。

    【讨论】:

    • 投票支持你参考弗里德尔的书。
    • +1 为 Jeff Friedl 的书。另请查看查看en.wikipedia.org/wiki/Comparison_of_regular_expression_engines 进行比较。对于大多数实际目的,我希望您的 .Net、Java 和 Perl 正则表达式能够兼容。如果您的正则表达式很复杂,您可能会遇到问题(例如递归)。
    • JavaScript 和 Java 实现了 PCRE 的一个子集,而 JS 实现了一个较小的子集。
    • 今天刚买了弗里德尔的书(第 3 版)。希望学习正则表达式以在 JavaScript 中使用。
    【解决方案2】:

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

    但实际上任何语言都会有“小”差异。对于大多数风格,您可以传递非常基本的内容,例如任何字符的. 或量词+*?,字符类也很常见,但它已经从\w 之类的预定义类开始,它是否支持?还是基于 ASCII 或 Unicode?​​p>

    flavor comparison on regular-expressions.info by Jan Goyvaerts 是一个很好的帮助。

    【讨论】:

    • 如果你的语言支持它,你为什么要避免这个重要的功能?
    【解决方案3】:

    最佳实践

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

    【讨论】:

    • 为什么要避免前瞻,而只在某些情况下后瞻?与前瞻相比,对所有语言的后向支持存在更多限制。
    • @stema ohh...对不起,我对他们感到困惑..谢谢指出
    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 2016-02-29
    • 2012-04-22
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多