Skip to content

正则表达式(Regular Expression,简称正则或Regex)是一种用于字符串模式匹配的工具,能够帮助我们高效地搜索、替换、提取和验证文本。正则表达式的规则包括字符匹配、元字符、量词、位置锚定和分组等内容。以下是正则表达式的详细规则:

1. 字符匹配

  • 普通字符:普通字符会按字面意义匹配。例如,a 匹配字符串中的字符 a
  • 转义字符:一些特殊字符如 .*+ 需要通过反斜杠 \ 转义,如 \. 匹配的是字符 . 而不是通配符。

2. 元字符

元字符是正则表达式中特殊的字符,用来表达特殊的含义。

  • .:匹配任意单个字符(除了换行符)。
    • 例:a.c 可以匹配 abca1c 等。
  • \d:匹配任何一个数字,等价于 [0-9]
    • 例:\d{3} 可以匹配三位数字如 123
  • \w:匹配任何字母、数字或下划线,等价于 [A-Za-z0-9_]
    • 例:\w+ 可以匹配一个或多个字母、数字或下划线。
  • \s:匹配任何空白字符(包括空格、制表符、换行符)。
    • 例:\s* 匹配零个或多个空白字符。
  • \b:匹配单词边界。
  • [ ]:匹配方括号中的任意一个字符。
    • 例:[abc] 匹配 abc
  • [^ ]:匹配不在方括号中的任意字符。
    • 例:[^abc] 匹配不是 abc 的任何字符。
  1. \d
    • 含义:匹配一个数字,等价于[0 - 9]
    • 示例:正则表达式\d可以匹配字符串 “123abc” 中的 “1”、“2”、“3”。如果要匹配多个数字,可以使用\d+,比如在 “abc123def” 中,\d+会匹配 “123”。
  2. \D
    • 含义:匹配一个非数字字符,等价于[^0 - 9]
    • 示例:在字符串 “abc123def” 中,\D可以匹配 “a”、“b”、“c”、“d”、“e”、“f”,\D+则会匹配 “abc” 和 “def”。
  3. \S
    • 含义:匹配一个非空白字符(空白字符包括空格、制表符、换行符等)。
    • 示例:在字符串 “abc def” 中,\S可以匹配 “a”、“b”、“c”、“d”、“e”、“f”,\S+会匹配 “abc” 和 “def”。
  4. \s
    • 含义:匹配一个空白字符,包括空格、制表符(\t)、换行符(\n)等。
    • 示例:在文本 “Hello\tWorld\n” 中,\s可以匹配 “\t” 和 “\n”,\s+会匹配 “\t”(一个制表符)和 “\n”(一个换行符)。如果要匹配多个连续的空白字符,例如在一段有多个空格的文本中,\s+就很有用。
  5. \w
    • 含义:匹配一个单词字符,包括字母、数字和下划线,等价于[a - zA - Z0 - 9_]
    • 示例:在字符串 “abc_123” 中,\w可以匹配 “a”、“b”、“c”、“_”、“1”、“2”、“3”,\w+会匹配 “abc_123”。
  6. \W
    • 含义:匹配一个非单词字符,等价于[^a - zA - Z0 - 9_]
    • 示例:在字符串 “abc@123” 中,\W可以匹配 “@”,\W+会匹配 “@”。这在处理包含特殊符号的文本,需要将非单词字符分离出来时很有用。

小写与大写互补,[\d\D]等效于.

  • [abc]:匹配由a或b或c组成的单个字符
  • a|b|c:匹配由a或b或c组成的单个字符

3. 量词

量词用于指定一个字符或一组字符应该出现的次数。

  • \*:匹配前面的字符零次或多次。

    • 例:ab* 匹配 aababb 等。
  • +:匹配前面的字符一次或多次。

    • 例:ab+ 匹配 ababb 等,但不匹配 a
  • ?:匹配前面的字符零次或一次。

    • 例:ab? 匹配 aab
  • {n}:匹配前面的字符恰好 n 次。

    • 例:\d{3} 匹配三个数字。
  • {n,}:匹配前面的字符至少 n 次。

    • 例:\d{2,} 匹配至少两位数字。
  • {n,m}:匹配前面的字符至少 n 次,但不超过 m 次。

    • 例:\d{2,5} 匹配 2 到 5 位数字。

4. 位置锚定

锚定符用于指定模式应该出现的位置。

  • ^:匹配字符串的开头。
    • 例:^abc 匹配以 abc 开头的字符串。
  • $:匹配字符串的结尾。
    • 例:abc$ 匹配以 abc 结尾的字符串。
  • \b:匹配单词的边界。
    • 例:\bword\b 只匹配单独的 word,而不匹配 swordwording

5. 分组与捕获

分组允许我们将正则表达式的一部分视为一个整体,并捕获匹配的子字符串。

  • ( ):用于分组和捕获。
    • 例:(abc)+ 匹配 abcabcabc
  • (?: ):非捕获组,不会保存匹配的子字符串。
    • 例:(?:abc)+ 匹配 abcabcabc,但不会捕获。
  • \n:捕获组的反向引用,n 是一个数字,表示捕获的第 n 组。
    • 例:(\d)\1 匹配两个相同的数字。

6. 其他特殊字符

  • |:逻辑或,表示左右两个表达式的任意一个。
    • 例:abc|xyz 匹配 abcxyz
  • \:转义字符,用于匹配元字符本身。
    • 例:\. 匹配字符 .

7. 修饰符

  • (?i)忽略大小写(case-insensitive)

  • (?m)多行模式(multiline)

  • (?s)单行模式(dotall,使 . 匹配换行符)

  • 在正则表达式中,(?msi) 这样的特殊标识被称为 正则表达式的模式修饰符(Pattern Modifiers)正则标志(Regex Flags)。它们用于控制正则表达式的匹配行为,通常出现在正则表达式的开头(或某些语言中通过其他方式指定)。

    不同的编程语言或正则引擎对这些修饰符的支持可能略有不同,但常见的修饰符包括:

    (1) (?i):忽略大小写(case-insensitive)

    • 使正则表达式不区分大小写匹配。

    (2) (?m):多行模式(multiline)

    • 使 ^$ 匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾。

    (3) (?s):单行模式(dotall)

    • 使 . 匹配包括换行符在内的所有字符(默认 . 不匹配换行符)。

8. 懒惰模式与贪婪模式

正则表达式默认是贪婪匹配(尽可能多地匹配),而懒惰模式是尽可能少地匹配。

  • 贪婪匹配:默认模式,量词 *+ 等是贪婪的,尽可能多地匹配字符。

  • 懒惰匹配:在量词后面加 ?

    可以使其变为懒惰模式。

    • 例:ab*? 将匹配尽可能少的 b,而不是尽可能多。

9. ?用于“分组控制”

校验后面内容,但是不匹配后面内容

写法本质
(?:...)分组但不记录
(?=...)后面必须是
(?!...)后面不能是
(?<=...)前面必须是
(?<!...)前面不能是

示例

  1. 所有汉字[一-龥] \p
  2. 匹配邮箱地址[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
  3. 匹配手机号1[3-9]\d{9}
  4. 匹配日期\d{4}-\d{2}-\d{2}(匹配格式如 2023-09-01)