正则的功能
- 校验数据的有消息 比如校验手机号、邮箱
- 查找符合要求的文本内容,比如查找符合某规则的号码
- 对文本进行分割,替换等操作,比如用连续的空白符切割
元字符
特殊单字符
空白符
量词
范围
量词与贪婪
贪婪匹配(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)