匹配模式

什么是匹配模式

所谓匹配模式,指的是正则中一些改变元字符匹配行为的方式,比如匹配时不区分英文字母大小写。常见的匹配模式有 4 种,分别是不区分大小写模式、点号通配模式、多行模式和注释模式。 下面主要来介绍一下这 4 种模式。

不区分大小写模式(Case-Insensitive)

先来看不区分大小写模式,它顾名思义,在进行文本匹配时,我们要关心单词本身的意义。比如要查找单词 cat,并不关心单词是 CAT、Cat,还是 cat。想要达到这个效果,我们可能会把正则写成这样:

1
[Cc][Aa][Tt]

这样写虽然可以达到目的,但不够直观,如果单词比较长,写起来容易出错,阅读起来也会比较困难。

根据这种使用场景,不区分大小写模式就派上用场了。

不区分大小写是匹配模式的一种。当我们把模式匹配符放在整个正则前面时,就表示整个正则表达式都是不区分大小写的。

模式修饰符的语法:(?模式标识)

我们只需要把模式修饰符放在对应的正则前,就可以使用指定的模式了。在不区分大小写模式中,由于不分大小写的英文是 Case-Insensitive,那么对应的模式标识就是 I 的小写字母 i,不区分大小写的模式修饰符:

1
(?i)

所以不区分大小写的 cat 就可以写成:

1
(?i)cat

点号通配模式(Dot All)

在元字符中有一个特殊单字符:(.),它可以匹配上任何符号,但不能匹配换行。当我们需要匹配真正的“任意”符号的时候,可以使用:

1
2
3
[\s\S] 
或者
[\w\W]

但是这样写就不够简洁自然,所以正则中提供了一种模式,让英文的点(.)可以匹配上包括换行的任何字符。

这个模式就是点号通配模式,单行的英文表示是 Single Line,那么单行模式对应的模式修饰符就是:

1
(?s)

多行匹配模式(MultiLine)

有单行匹配模式就会有多行匹配模式,通常情况下,(^)匹配整个字符串的开头,($)匹配整个字符串的结尾。多行匹配模式改变的就是(^) 和 ( $ ) 的匹配行为。

这个模式有什么用呢?在处理日志时,如果日志以时间开头,有一些日志打印了堆栈信息,占用了多行,我们就可以使用多行匹配模式,在日志中匹配到以时间开头的每一行日志。

注释匹配模式

在实际工作中,正则可能会很复杂,这就导致编写、阅读和维护正则都会很困难。我们在写代码的时候,通常会在一些关键的地方加上注释,让代码更易于理解。很多语言也支持在正则中添加注释,让正则更容易阅读和维护,这就是正则的注释模式。正则中注释模式是使用 (?#comment) 来表示。

比如我们可以把单词重复出现一次的正则 (\w+) \1 写成下面这样,这样的话,就算不是很懂正则的人也可以通过注释看懂正则的意思。

1
(\w+)(?#word) \1(?#word repeat again)

小结

最后,我你总结一下,正则中常见的四种匹配模式,分别是:不区分大小写、点号通配模式、多行模式和注释模式。

  • 不区分大小写模式,它可以让整个正则或正则中某一部分进行不区分大小写的匹配。
  • 点号通配模式也叫单行匹配,改变的是点号的匹配行为,让其可以匹配任何字符,包括换行。
  • 多行匹配说的是 ^ 和 $ 的匹配行为,让其可以匹配上每行的开头或结尾。
  • 注释模式则可以在正则中添加注释,让正则变得更容易阅读和维护。

而且匹配模式是可以多个并用的,也就是既可以使用不区分大小写模式也可以使用点号通配模式:

1
(?i.)

匹配模式
https://sunshinechen.cn/2022/12/19/匹配模式/
作者
sunshine
发布于
2022年12月19日
许可协议