通过 RegexLearn 网站进行学习。
匹配
- 直接输入字符代表匹配字符
- 使用
.表示所有字符 b[aeiou]r方括号中表示要匹配的字符 此正则表达式可以匹配 bar ber bir bor bur^可以表示否定b[^eo]r匹配 bar ber bir bor bur- 字母范围
[a-z][e-o]匹配 abcdefghijklmnopqrstuvwxyz - 数字范围
[0-9][3-6]匹配 0123456789
重复
- 字符后面加上
*,表示一个字符完全不匹配或可以匹配多次。be*r匹配 br ber beer - 表示一个字符可以出现一次或多次,我们将
+放在它后面。be+r匹配 br ber beer - 表示一个字符是可选的,我们在它后面加一个
?。colou?r匹配 color colour - 表示一个字符出现的确切次数,我们在该字符的末尾,将它出现的次数写进大括号
{}中,如{n}。be{2}r匹配 ber beer beeer beeeer - 为了表示一个字符至少出现多少次,我们在该字符的末尾,将它至少应出现的次数写进大括号
{}中,并在数字后面加上逗号,,如{n, }。be{3,}r匹配 ber beer beeer beeeer - 为了表示一些字符出现的次数在某个数字范围内,我们在该字符的末尾,将它至少和至多出现的次数写进大括号
{}中,中间用逗号,分隔,如{x,y}。be{1,3}r匹配 ber beer beeer beeeer
分组
- 分组(): 我们可以对一个表达式进行分组,并用这些分组来引用或执行一些规则。为了给表达式分组,我们需要将文本包裹在 () 中。
(haa)表示给 haa 分组 - 引用组\1: 单词 ha 和 haa 分组如下。第一组用
\1来避免重复书写。这里的1表示分组的顺序。(ha)-\1,(haa)-\2匹配 ha-ha,haa-haa
相当于使用 \1 来代替了 ha \2 来代替了 haa - 非捕获分组(?:): 可以对表达式进行分组,并确保它不被引用捕获。例如,有两个分组,但我们用
\1引用的第一个组实际上是指向第二个组,因为第一个是未被捕获的分组。(?:ha)-ha,(haa)-\1匹配 ha-ha,haa-haa - 竖线|: 竖线允许一个表达式包含多个不同的分支。所有分支用
|分隔。和在字符层面上运作的字符集[abc]不同,分支在表达式层面上运作。(c|r)at|dog匹配 cat rat dog - 转义字符\: 在书写正则表达式时,我们会用到
{ } [ ] / \ + * . $^ | ?这些特殊字符 。为了匹配这些特殊字符本身,我们需要通过 \ 将它们转义。
(\*|\.)匹配 (*) Asterisk .
匹配符号
- 插入符^: 匹配字符串的开始. 用
[0-9]查找数字,若仅查找行首的数字,请在表达式前面加上^。^[0-9] - 美元符号$: 在 html 的后面添加 $,来查找仅在行末出现的 html
html$ - 单词字符\w: 表达式 \w 用于查找字母、数字和下划线。
\w匹配 abcABC123 _.:!? - 非单词字符\W: 匹配除字母、数字和下划线之外的字符。
\W匹配 abcABC123 _.:!? - \d: 仅用来匹配数字
- \D: 匹配除数字之外的字符
- 空白符\s: 仅匹配空白字符
- 非空白符\S 匹配除空白符之外的字符
- 单词边界\b: 匹配单词的开头或末尾。
- 非单词边界\B: 匹配不在单词的开头或末尾的位置。
零宽断言
[!note]+ 如果我们希望正在写的词语出现在另一个词语之前或之后,我们需要使用「零宽断言」
-
正向先行断言: (?=) 例如,我们要匹配文本中的小时值。为了只匹配后面有 PM 的数值,我们需要在表达式后面使用正向先行断言
(?=),并在括号内的 = 后面添加 PM。\d+(?=PM)匹配 Date: 4 Aug 3PM -
负向先行断言: (?!) 例如,我们要在文本中匹配除小时值以外的数字。我们需要在表达式后面使用负向先行断言
(?!),并在括号内的 ! 后面添加 PM,从而只匹配没有 PM 的数值。\d+(?!PM)匹配 Date: 4 Aug 3PM -
正向后行断言: (?<=) 例如,我们要匹配文本中的金额数。为了只匹配前面带有
$的数字。我们要在表达式前面使用正向后行断言(?<=),并在括号内的 = 后面添加 \$。(?<=\$)\d+匹配 Product Code: 1064 Price: $5 -
负向后行断言: (?<!) 例如,我们要在文本中匹配除价格外的数字。为了只匹配前面没有
$的数字,我们要在表达式前用负向后行断言(?<!),并在括号内的 ! 后面添加 \$。 匹配(?<!\$)\d+匹配 Product Code: 1064 Price: $5
标志
[!note] 标志改变表达式的输出。这就是标志也称为 修饰符 的原因。标志决定表达式是否将文本视作单独的行处理,是否区分大小写,或者是否查找所有匹配项。
-
全局标志 g 全局标志使表达式选中所有匹配项,如果不启用全局标志,那么表达式只会匹配第一个匹配项。
/\w+\.com/匹配 domain.com, test.com, site.com/\w+\.com/g匹配 domain.com, test.com, site.com -
多行标志 正则表达式将所有文本视作一行。但如果我们使用了多行标志,它就会单独处理每一行。这次,我们将根据每一行行末的规律来写出表达式。
/\w+\.com$/gm匹配:domain.comtest.comsite.com- 忽略大小写 为了使我们编写的表达式不再大小写敏感,我们必须启用 不区分大小写 标志。
/\w+\.com$/gmi匹配:DOMAIN.COMTEST.COMSITE.COM贪婪匹配与懒惰匹配
[!note] 贪婪匹配 正则表达式默认执行贪婪匹配。这意味着匹配内容会尽可能长。请看下面的示例,它匹配任何以 r 结尾的字符串,以及前面带有该字符串的文本,但它不会在第一个 r 处停止匹配。
.*r匹配 ber beer beeer beeeer
[!tip] 懒惰匹配 与贪婪匹配不同,懒惰匹配在第一次匹配时停止。 下面的例子中,在 * 之后添加 ?,将查找以 r 结尾且前面带有任意字符的第一个匹配项。这意味着本次匹配将会在第一个字母 r 处停止。
.*?r匹配 ber beer beeer beeeer