正则表达式

82 阅读3分钟

正则的功能

  • 校验数据的有消息 比如校验手机号、邮箱
  • 查找符合要求的文本内容,比如查找符合某规则的号码
  • 对文本进行分割,替换等操作,比如用连续的空白符切割

元字符

特殊单字符

空白符

量词

范围

量词与贪婪

贪婪匹配(Greedy)

在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配。

在字符串 aaabb 中使用正则 a* 的匹配过程。

非贪婪匹配(Lazy)

如何将贪婪模式变成非贪婪模式呢?我们可以在量词后面加上英文的问号 (?),正则就变成了 a*?。此时的匹配结果如下:

分组与引用

括号在正则中可以用于分组,被括号括起来的部分“子表达式”会被保存成一个子组。

不保存子组

在括号里面的会保存成子组,但有些情况下,你可能只想用括号将某些部分看成一个整体,后续不用再用它,类似这种情况,在实际使用时,是没必要保存子组的。这时我们可以在括号里面使用 ?: 不保存子组。

括号嵌套

左括号(开括号)是第几个,就可以确定是第几个子组。

假设时间格式是 2020-05-10 20:23:05 。 日期分组编号是 1,时间分组编号是 5,年月日对应的分组编号分别是 2,3,4,时分秒的分组编号分别是 6,7,8。

分组引用

在知道了分组引用的编号 (number)后,大部分情况下,我们就可以使用 “反斜扛 + 编号”,即 \number 的方式来进行引用,而 JavaScript 中是通过编号来引用,如编号来引用,如1。

匹配模式

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

当我们把模式修饰符放在整个正则前面时,就表示整个正则表达式都是不区分大小写的。模式修饰符是通过 (? 模式标识) 的方式来表示的。 我们只需要把模式修饰符放在对应的正则前,就可以使用指定的模式了。

点号通配模式(Dot All)

JavaScript 不支持此模式,那么我们就可以使用前面说的[\s\S]等方式替代

?i 不区分大小写 ?s 单行

多行匹配模式(Multiline)

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

多行模式的作用在于,使 ^ 和 $ 能匹配上每行的开头或结尾,我们可以使用模式修饰符号 (?m) 来指定这个模式。

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

注释模式(Comment)

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

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

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