章节大纲

  • 正则表达式的不同变体

    正则表达式有多个变体,它们不仅在具体的语法上有所不同,在功能上也各具特色。支持正则表达式的工具和编程语言通常也会有自己独特的实现方式


    常见的正则表达式变体

    1. 简单正则表达式(Simple Regular Expressions)

      • 主要用于向后兼容,但在符合 POSIX 标准的系统上已被弃用。
    2. 基本正则表达式(Basic Regular Expressions,BRE)

      • 由一些 Unix Shell 工具(如 grepsed)使用。
    3. Perl 兼容正则表达式(Perl-Compatible Regular Expressions,PCRE)

      • Perl 及一些应用程序使用,功能非常强大。
    4. POSIX 基本正则表达式(POSIX Basic Regular Expressions,POSIX BRE)

      • 旨在增强不同工具间的一致性,但某些传统的 Unix 工具不支持这些扩展。
    5. POSIX 扩展正则表达式(POSIX-Extended Regular Expressions,POSIX ERE)

      • 通过 -E 选项在某些 Unix 工具(如 grep -Esed -E)中启用。
    6. 非 POSIX 基本正则表达式(Non-POSIX Basic Regular Expressions)

      • 提供 POSIX 不支持的额外字符类,例如 \w(匹配字母和数字)。
    7. Emacs 正则表达式(Emacs Regular Expressions)

      • 主要用于 Emacs 编辑器 的文本搜索和替换。
    8. Shell 正则表达式(Shell Regular Expressions)

      • 用于 模式匹配(Pattern Matching)和文件名替换(Filename Substitution),功能较有限。

    贪婪匹配(Greedy Expressions)

    在正则表达式中,*+量词(Quantifiers)默认是贪婪的(Greedy),它们会尽可能多地匹配字符。这种特性在某些情况下可能会导致不符合预期的匹配结果。

    示例:

    假设我们希望匹配第一个用双引号 " 括起来的字符串,例如:

    These words include "cat", "mat", and "pat".
    

    使用正则表达式 "*" 会匹配:

    These words include "cat", "mat", and "pat".
    

    错误匹配部分(斜体部分):

    These words include *"cat", "mat", and "pat".*
    

    它匹配了整个"cat", "mat", and "pat",而我们只想匹配第一个 "cat"

    修正方案

    • 使用非贪婪匹配(Non-Greedy Matching)
      • 一些正则表达式变体支持非贪婪运算符
        • *?
        • +?
        • }?
      • 例如,在 PHP 中,可以使用 U 修饰符使量词变为非贪婪匹配:
        /".*"/U
        
    • 使用排除匹配法
      • 不支持 *? 的环境中,我们可以使用排除字符来控制匹配范围:
        "[^"]*"
        
      • 这个表达式确保 " 内部的内容不能包含双引号,从而正确匹配:
        "cat"
        

    正则表达式特性对比

    不同工具和编程语言对正则表达式的支持不同。想要了解哪些功能或变体适用于特定工具或语言,可以参考 regular-expressions.info 提供的对比表格(Comparison Table)