一、关于

正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。

正则表达式可以用来:

(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。

(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。

(3)用来替换,比普通的替换更强大

可以使用 regexper.com 这个网站来可视化的表现正则所匹配的内容。

二、子表达式

()元字符所包含的正则表达式被分为一组,每一个分组都是一个子表达式。

在子表达式中可以使用|来表示或的意思。

例:(a|b) 匹配a或者b。

回溯引用

回溯引用(backreference)指的是模式的后面部分引用前面已经匹配到的子字符串。

使用\num来进行引用,如\1引用第一个子表达式的结果。(\0表示整个表达式)

例:可以使用\b(\w+)\s\1匹配下面一段文字中连续相同的单词

The china china is not only made in china!

我们不想子表达式被引用,可以使用非捕获正则(?:regex)这样就可以避免浪费内存

前向查找(?=regex)

前向查找(lookahead)是用来限制后缀的。凡是以(?=regex)包含的子表达式在匹配过程中都会用来限制前面的表达式的匹配。

例:happy happily这两个单词,我想获得以happ开头的副词,那么就可以使用happ(?=ily)来匹配。

负前向查找(?!regex)

如果我想过滤所有以happ开头的副词,那么也可以采用负前向查找的正则happ(?!ily),就会匹配到happy单词的happ前缀。

后向查找(?<=regex)

后向查找(lookbehind)是通过指定一个子表达式,然后从符合这个子表达式的位置出发开始查找符合规则的字串。

例:apple和people都包含ple这个后缀,那么如果我只想找到apple的ple,该怎么做呢?我们可以通过限制app这个前缀(?<=app)ple,就能唯一确定ple这个单词了。

负后向查找(?<!regex)

如果想要查找apple的ple也可以这么写成(?<!peo)ple

三、定位符

定位符用来描述字符串或单词的边界

定位符 意义
^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置
\b 匹配一个单词边界,即字与空格间的位置
\B 非单词边界匹配

例:/it\b/会匹配rabbit但是不会匹配itec和sitting

四、字符簇

使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。

[a-z] //匹配所有的小写字母 
[A-Z] //匹配所有的大写字母 
[a-zA-Z] //匹配所有的字母 
[0-9] //匹配所有的数字 
[0-9\.\-] //匹配所有的数字,句号和减号 
[ \f\r\t\n] //匹配所有的白字符

用连字号可以表示一个字符的范围,

当在一组方括号里使用^时,它表示”非”或”排除”的意思,常常用来剔除某个字符

例:^[^0-9][0-9]$ 可以匹配非数字开头的a1。

五、限定符

限定符出现在范围表达式之后,应用于整个范围表达式

限定符 解释
{n} 匹配前面的子表达式n次
{n,} 匹配前面的子表达式至少n次
{n,m} 匹配前面的子表达式n到m次
  • | 匹配前面的子表达式零次或多次,等价于{0,}
  • | 匹配前面的子表达式一次或多次,等价于 {1,}
    ? | 匹配前面的子表达式零次或一次, 等价于 {0,1}。

*+ 限定符都是贪婪的,它们会尽可能多的匹配文字。

在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。

例:对于<h1>lazyrabbit</h1>

/<.*>/ 将匹配整个内容

/<.*?>/ 只会匹配<h1>

六、元字符

下面是经常会使用到的一些元字符:

元字符 解释
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
  • | 匹配前面的子表达式零次或多次
  • | 匹配前面的子表达式一次或多次
    ? | 匹配前面的子表达式零次或一次;当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。
    . | 匹配除换行符(\n、\r)之外的任何单个字符
    \d | 匹配一个数字字符。等价于 [0-9]
    \D | 匹配一个非数字字符。等价于 [^0-9]
    \w | 匹配字母、数字、下划线。等价于[A-Za-z0-9_]
    \W | 匹配非字母、数字、下划线。等价于[^A-Za-z0-9_]

使用\可以对一些内容进行转义,如使用在元字符前可以匹配元字符本身

例:\.可匹配.;\^可匹配^

参考

https://www.runoob.com/regexp/regexp-example.html

http://www.regexlab.com/zh/regref.htm#special

https://juejin.im/post/5cdcd42551882568651554e6#heading-0

https://juejin.im/post/5965943ff265da6c30653879#heading-31