正则表达式 | AI生成和翻译

Home 2025.04

正则表达式,常简称为 “regex” 或 “regexp”,是一种用于文本模式匹配的强大且多功能的工具。它们提供了一种简洁灵活的方式来基于定义的模式搜索、操作和验证字符串。虽然语法起初可能看起来令人生畏,但掌握正则表达式可以显著增强您在各种编程语言、文本编辑器和命令行工具中的文本处理能力。

本指南将带您从正则表达式的基础知识到更高级的概念。

I. 基础:正则表达式的构建模块

正则表达式的核心是一系列定义搜索模式的字符。这些字符可以是字面字符(匹配自身)或特殊字符(具有特定含义)。

A. 字面字符:

正则表达式中的大多数字符都按字面意义匹配自身。例如:

B. 元字符:特殊能力

元字符是赋予正则表达式威力的构建模块。它们具有特殊含义,不按字面意义匹配自身。以下是最常见的元字符:

  1. . (点号): 匹配除换行符(默认为 \n)之外的任何单个字符。
    • a.c 将匹配 “abc”、”adc”、”a1c”、”a c”,但不匹配 “ac” 或 “abbc”。
  2. ^ (脱字符):
    • 在字符集内部(见下文): 否定该集合,匹配任何在集合中的字符。
    • 在字符集外部: 匹配字符串的开头(或多行模式下行的开头)。
      • ^hello 将匹配 “hello world” 但不匹配 “say hello”。
  3. $ (美元符号): 匹配字符串的结尾(或多行模式下行的结尾)。
    • world$ 将匹配 “hello world” 但不匹配 “world hello”。
  4. * (星号): 匹配前面的字符或组零次或多次。
    • ab*c 将匹配 “ac”、”abc”、”abbc”、”abbbc” 等等。
  5. + (加号): 匹配前面的字符或组一次或多次。
    • ab+c 将匹配 “abc”、”abbc”、”abbbc”,但不匹配 “ac”。
  6. ? (问号):
    • 匹配前面的字符或组零次或一次(使其成为可选的)。
      • ab?c 将匹配 “ac” 和 “abc”,但不匹配 “abbc”。
    • 用作量词修饰符以使匹配变为非贪婪模式(见量词部分)。
  7. {} (花括号): 指定前面字符或组的确切出现次数或范围。
    • a{3} 匹配恰好三个 “a”(例如,”aaa”)。
    • a{2,4} 匹配两到四个 “a”(例如,”aa”、”aaa”、”aaaa”)。
    • a{2,} 匹配两个或更多个 “a”(例如,”aa”、”aaa”、”aaaa”、…)。
  8. [] (方括号): 定义一个字符集,匹配括号内的任何单个字符。
    • [abc] 将匹配 “a”、”b” 或 “c”。
    • [a-z] 将匹配从 “a” 到 “z” 的任何小写字母(范围)。
    • [0-9] 将匹配从 “0” 到 “9” 的任何数字。
    • [A-Za-z0-9] 将匹配任何字母数字字符。
    • [^abc](以 ^ 开头)将匹配 “a”、”b” 或 “c” 之外的任何字符。
  9. \ (反斜杠): 转义下一个字符,将元字符视为字面字符或引入特殊字符序列。
    • \. 将匹配一个字面点号 “.”。
    • \* 将匹配一个字面星号 “*“。
    • \d 匹配任何数字(等同于 [0-9])。
    • \D 匹配任何非数字字符(等同于 [^0-9])。
    • \s 匹配任何空白字符(空格、制表符、换行符等)。
    • \S 匹配任何非空白字符。
    • \w 匹配任何单词字符(字母数字和下划线,等同于 [a-zA-Z0-9_])。
    • \W 匹配任何非单词字符(等同于 [^a-zA-Z0-9_])。
    • \b 匹配单词边界(单词字符和非单词字符之间的位置)。
    • \B 匹配非单词边界。
    • \n 匹配换行符。
    • \r 匹配回车符。
    • \t 匹配制表符。
  10. | (竖线符号): 充当 “或” 运算符,匹配竖线之前或之后的表达式。
    • cat|dog 将匹配 “cat” 或 “dog”。
  11. () (圆括号):
    • 分组: 将正则表达式的部分组合在一起,允许您将量词或 OR 运算符应用于整个组。
      • (ab)+c 将匹配 “abc”、”ababc”、”abababc” 等等。
      • (cat|dog) food 将匹配 “cat food” 或 “dog food”。
    • 捕获组: 捕获括号内表达式匹配的文本。这些捕获的组可以在以后引用(例如,用于替换或提取)。

II. 量词:控制重复

量词指定前一个元素(字符、组或字符集)可以出现的次数。

贪婪与非贪婪匹配:

默认情况下,量词是贪婪的,这意味着它们尝试匹配尽可能多的字符串。您可以通过在量词后添加 ? 来使其变为非贪婪的(或懒惰的)。非贪婪量词尝试匹配尽可能短的字符串。

III. 锚点:指定位置

锚点本身不匹配任何字符,而是断言字符串内的一个位置。

IV. 字符类:预定义集合

字符类为常用字符集提供了简写形式。

V. 分组与捕获

圆括号 () 有两个主要目的:

反向引用:

您可以在同一个正则表达式中使用 \1\2\3 等引用先前捕获的组,其中数字对应于捕获组开括号的顺序。

非捕获组:

如果您需要对正则表达式的部分进行分组而不创建捕获组,可以使用 (?:...)。这对于提高清晰度或性能很有用。

VI. 环视:不消耗字符的断言

环视是零宽度断言,它们检查字符串中当前位置之前或之后的模式,而不将匹配的环视部分包含在整体匹配中。

VII. 标志(修饰符):控制正则表达式行为

标志(或修饰符)用于改变正则表达式引擎的行为。它们通常在正则表达式模式的开头或结尾指定,具体取决于实现。常见的标志包括:

VIII. 正则表达式的实际应用

正则表达式广泛用于各个领域:

IX. 不同编程语言中的正则表达式

大多数现代编程语言都内置了对正则表达式的支持,尽管具体的语法和功能可能略有不同。您通常可以在标准库或模块中找到正则表达式功能。

X. 编写有效正则表达式的技巧

XI. 学习资源

结论

正则表达式是任何处理文本数据的人都不可或缺的工具。虽然最初的学习曲线可能看起来陡峭,但基于复杂模式高效搜索、操作和验证文本的能力是一项宝贵的技能。通过理解正则表达式的基本概念、元字符、量词和其他特性,您可以在广泛的应用中显著提高生产力和解决问题的能力。练习是掌握正则表达式的关键,所以不要犹豫,尝试并探索不同模式以应对各种文本处理任务。


Back Donate