一、关于
正则表达式(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