正则表达式

正则表通常被用来检索、替换那些符合某个模式(规则)的文本

组成

边界符

边界符说明
^表示匹配行首的文本(以谁开始)
$表示匹配行尾的文本(以谁结束)
( )标记一个子表达式的开始和结束位置

1、 ()

/([1-9])([a-z])/g

匹配 1a2b -> 1a 2b

圆括号会有一个副作用,使相关的匹配会被缓存,此时可用 ?: 放在第一个选项前来消除这种副作用

字符类

范围

一系列字符可供选择,只要匹配其中一个就可以了

量词

量词说明
*重复0次或更多次, 要匹配 * 字符,使用 \*
+重复1次或更多次, 要匹配 + 字符,使用 \+
?重复0次或1次, 要匹配 ? 字符,使用 ?
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
  1. 贪婪模式:正则中量词默认是贪婪匹配,用 a* 去匹配 aaabb 只会匹配 aaa
  2. 非贪婪模式:用 a*? 去匹配 aaabb 就只会匹配到单个的 a
  3. 独占模式:贪婪和非贪婪匹配都可能会进行回溯,独占模式也是进行贪婪匹配,但不进行回溯

修饰符

修饰符除了可以全局指定外,也可以在正则中对某一个分组来指定,如 (?i)(abc)ABC 匹配 ABCABC

预定义类

预定类说明
\cx匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符
\f匹配一个换页符
\n换行符
\r回车符
\t匹配一个制表符
\v匹配一个垂直制表符
\d匹配0-9之间的任一数字, 相当于[0-9]
\D匹配所有0-9以外的字符,相当于[^0-9]
\w匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_ ]
\W除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_ ]
\s匹配空格(包括换行符、制表符、空格符等),相等 于[ \tlr\n\v\f]
\S匹配非空格的字符,相当于[^ \tlr\n\v\f]
\b匹配一个单词边界,即字与空格间的位置
\B非单词边界匹配

运算符的优先级

从高到低:

正则流派

正则性能

  1. 提前编译:正则表达式都是通过被编译成自动机来进行字符串匹配的,所以使用编译好的正则表达式会比使用未编译的正则表达式更快
  2. 尽量准确表示匹配的范围,避免过于宽泛的匹配范围
  3. 提取出公共的部分,如 (abcd|abxy) 优化成 ab(cd|xy)
  4. 出现可能性大的放左边,由于正则是从左到右看的,把出现概率大的放左边,域名中 .com 的使用是比 .net 多的,所以我们可以写成`\.(?:com|net)\b`,而不是`\.(?:net|com)\b`。
  5. 只在必要时才使用子组,在正则中,括号可以用于归组,但如果某部分后续不会再用到,就不需要保存成子组。如果保存成子组,正则引擎必须做一些额外工作来保存匹配到的内容
  6. 警惕嵌套的子组重复,如果一个组里面包含重复,接着这个组整体也可以重复,比如 `(.*)*` 这个正则,匹配的次数会呈指数级增长
  7. 避免不同分支重复匹配