1571 字
8 分钟
正则表达式学习

通过 RegexLearn 网站进行学习。

匹配#

  1. 直接输入字符代表匹配字符
  2. 使用.表示所有字符
  3. b[aeiou]r方括号中表示要匹配的字符 此正则表达式可以匹配 bar ber bir bor bur
  4. ^可以表示否定 b[^eo]r 匹配 bar ber bir bor bur
  5. 字母范围[a-z] [e-o] 匹配 abcdefghijklmnopqrstuvwxyz
  6. 数字范围[0-9] [3-6] 匹配 0123456789

重复#

  1. 字符后面加上 *,表示一个字符完全不匹配或可以匹配多次。
    be*r 匹配 br ber beer
  2. 表示一个字符可以出现一次或多次,我们将 + 放在它后面。
    be+r 匹配 br ber beer
  3. 表示一个字符是可选的,我们在它后面加一个 ?
    colou?r 匹配 color colour
  4. 表示一个字符出现的确切次数,我们在该字符的末尾,将它出现的次数写进大括号 {} 中,如 {n}
    be{2}r 匹配 ber beer beeer beeeer
  5. 为了表示一个字符至少出现多少次,我们在该字符的末尾,将它至少应出现的次数写进大括号 {} 中,并在数字后面加上逗号 ,,如 {n, }
    be{3,}r 匹配 ber beer beeer beeeer
  6. 为了表示一些字符出现的次数在某个数字范围内,我们在该字符的末尾,将它至少和至多出现的次数写进大括号 {} 中,中间用逗号 , 分隔,如 {x,y}
    be{1,3}r 匹配 ber beer beeer beeeer

分组#

  1. 分组(): 我们可以对一个表达式进行分组,并用这些分组来引用或执行一些规则。为了给表达式分组,我们需要将文本包裹在 () 中。
    (haa) 表示给 haa 分组
  2. 引用组\1: 单词 ha 和 haa 分组如下。第一组用 \1 来避免重复书写。这里的 1 表示分组的顺序。
    (ha)-\1,(haa)-\2 匹配 ha-ha,haa-haa
    相当于使用 \1 来代替了 ha \2 来代替了 haa
  3. 非捕获分组(?:): 可以对表达式进行分组,并确保它不被引用捕获。例如,有两个分组,但我们用 \1 引用的第一个组实际上是指向第二个组,因为第一个是未被捕获的分组。
    (?:ha)-ha,(haa)-\1 匹配 ha-ha,haa-haa
  4. 竖线|: 竖线允许一个表达式包含多个不同的分支。所有分支用 | 分隔。和在字符层面上运作的字符集 [abc] 不同,分支在表达式层面上运作。
    (c|r)at|dog 匹配 cat rat dog
  5. 转义字符\: 在书写正则表达式时,我们会用到 { } [ ] / \ + * . $^ | ? 这些特殊字符 。为了匹配这些特殊字符本身,我们需要通过 \ 将它们转义。
    (\*|\.) 匹配 (*) Asterisk .

匹配符号#

  1. 插入符^: 匹配字符串的开始. 用 [0-9]查找数字,若仅查找行首的数字,请在表达式前面加上 ^
    ^[0-9]
  2. 美元符号$: 在 html 的后面添加 $,来查找仅在行末出现的 html
    html$
  3. 单词字符\w: 表达式 \w 用于查找字母、数字和下划线。
    \w 匹配 abcABC123 _.:!?
  4. 非单词字符\W: 匹配除字母、数字和下划线之外的字符。
    \W 匹配 abcABC123 _.:!?
  5. \d: 仅用来匹配数字
  6. \D: 匹配除数字之外的字符
  7. 空白符\s: 仅匹配空白字符
  8. 非空白符\S 匹配除空白符之外的字符
  9. 单词边界\b: 匹配单词的开头或末尾。
  10. 非单词边界\B: 匹配不在单词的开头或末尾的位置。

零宽断言#

[!note]+ 如果我们希望正在写的词语出现在另一个词语之前或之后,我们需要使用「零宽断言」

  1. 正向先行断言: (?=) 例如,我们要匹配文本中的小时值。为了只匹配后面有 PM 的数值,我们需要在表达式后面使用正向先行断言 (?=),并在括号内的 = 后面添加 PM。
    \d+(?=PM) 匹配 Date: 4 Aug 3PM

  2. 负向先行断言: (?!) 例如,我们要在文本中匹配除小时值以外的数字。我们需要在表达式后面使用负向先行断言 (?!),并在括号内的 ! 后面添加 PM,从而只匹配没有 PM 的数值。 \d+(?!PM) 匹配 Date: 4 Aug 3PM

  3. 正向后行断言: (?<=) 例如,我们要匹配文本中的金额数。为了只匹配前面带有 $ 的数字。我们要在表达式前面使用正向后行断言 (?<=),并在括号内的 = 后面添加 \$。 (?<=\$)\d+ 匹配 Product Code: 1064 Price: $5

  4. 负向后行断言: (?<!) 例如,我们要在文本中匹配除价格外的数字。为了只匹配前面没有 $ 的数字,我们要在表达式前用负向后行断言 (?<!),并在括号内的 ! 后面添加 \$。 匹配 (?<!\$)\d+ 匹配 Product Code: 1064 Price: $5

标志#

[!note] 标志改变表达式的输出。这就是标志也称为 修饰符 的原因。标志决定表达式是否将文本视作单独的行处理,是否区分大小写,或者是否查找所有匹配项。

  1. 全局标志 g 全局标志使表达式选中所有匹配项,如果不启用全局标志,那么表达式只会匹配第一个匹配项。 /\w+\.com/ 匹配 domain.com, test.com, site.com /\w+\.com/g 匹配 domain.com, test.com, site.com

  2. 多行标志 正则表达式将所有文本视作一行。但如果我们使用了多行标志,它就会单独处理每一行。这次,我们将根据每一行行末的规律来写出表达式。

/\w+\.com$/gm
匹配:
domain.com
test.com
site.com
  1. 忽略大小写 为了使我们编写的表达式不再大小写敏感,我们必须启用 不区分大小写 标志。
/\w+\.com$/gmi
匹配:
DOMAIN.COM
TEST.COM
SITE.COM

贪婪匹配与懒惰匹配#

[!note] 贪婪匹配 正则表达式默认执行贪婪匹配。这意味着匹配内容会尽可能长。请看下面的示例,它匹配任何以 r 结尾的字符串,以及前面带有该字符串的文本,但它不会在第一个 r 处停止匹配。 .*r 匹配 ber beer beeer beeeer

[!tip] 懒惰匹配 与贪婪匹配不同,懒惰匹配在第一次匹配时停止。 下面的例子中,在 * 之后添加 ?,将查找以 r 结尾且前面带有任意字符的第一个匹配项。这意味着本次匹配将会在第一个字母 r 处停止。 .*?r 匹配 ber beer beeer beeeer

正则表达式学习
http://www.shineacz.top/posts/正则表达式学习/
作者
shineAcZ
发布于
2025-09-08
许可协议
CC BY 4.0