正则表达式必知必会-笔记
一、基本元字符
.
(匹配任意单个字符)|
(逻辑或操作符)[]
(匹配字符集合中的一个字符)[^]
(对字符集合求非)[^0-9] //表示非数字字符
-
(定义一个区间,必须放在[]中)[a-z] //表示字母a-z
\
(对下一个字符转义)
二、元字符
\d
(匹配任意数字字符)\D
(\d的反义)\n
(换行符)\r
(回车符)\s
(匹配一个空白字符)\S
(\s的反义)\t
(制表符)\w
(匹配任意字母数字或下划线)\W
(\w的反义)
三、数量元字符
*
(匹配前一个字符或子表达式的>=0次重复)+
(匹配前一个字符或子表达式的>=1次重复)?
(匹配前一个字符或子表达式的0次或1次重复){n}
(匹配前一个字符或子表达式的n次重复){m,n}
(匹配前一个字符或子表达式的m至n次重复){n,}
(匹配前一个字符或子表达式的>=n次重复)*?
(*的懒惰型版本)+?
(+的懒惰型版本){n,}?
({n,}的懒惰型版本)
匹配一个电子邮箱
\w+[\w.]*@[\w.]+\.\w+
//可以匹配ben@forta.com和ben.forta@forta.com
防止过度匹配(懒惰型版本)
<b>one</b> and <b>two</b>
//正则表达式 <b>.*</b>
//结果一行全匹配了
//正则表达式 <b>.*?</b>
//结果 <b>one</b>和<a>two</b>分开匹配到
四、位置元字符
^
(匹配字符串的开头)$
(匹配字符串的结尾)\b
(匹配单词边界)(\b位于与\w相匹配的字符和与\W相匹配的字符之间)
例如
the cat scattered his food all over the room
//正则表达式 \bcat\b
//结果只匹配cat,不匹配scattered里面的cat
五、回溯引用和前后查找
()
(定义一个子表达式)\1
(匹配第1个子表达式,\2代表第2个子表达式,依此类推)?=
(向前查找)?<=
(向后查找)
查找IP地址初步版
12.159.46.200(每组数字由1至3个数字组成)
//正则表达式 \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
//子表达式 (\d{1,3}\.){3}\d{1,3}一样的效果
查找年份
1967-08-17
//正则表达式 19|20\d{2}
//结果只匹配19,因为|把左边和右边分别作为一个整体,解析为19或20\d{2}
//子表达式(19|20)\d{2}
//结果 1967
查找IP地址加强版:每一组数字都在0-255之间(子表达式的嵌套)
规则如下:
1、任何一个1位或2位数字
2、任何一个以1开头的3位数字
3、任何一个以2开头、第2位数字在0-4之间的3位数字
4、任何一个以25开头,第3位数字在0-5之间的3位数字
(((\d{1,2})|(1d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1d{2})|(2[0-4]\d)|(25[0-5]))
回溯引用:模式的后半部分引用在前半部分中定义的子表达式
this is a block of of text, several words here are are repeated, and and they should not be.
//正则表达式 [ ]+(\w+)[ ]+\1
//结果 of of 和 are are 及 and and 被匹配
匹配html文本
<h1>one paragraph</h1>
<h2>two paragraph</h2>
<h3>three paragraph</h2>
//正则表达式 <h[1-6]> .*?</h\1>
结果只匹配前两段
回溯引用在替换操作中的应用
313-555-1234
248-555-9999
810-555-90000
//正则表达式 (\d{3})(-)(\d{3}(-)(\d{4}))
//替换 ($1) $3-$5
//结果
(313) 555-1234
(248) 555-9999
(810) 555-90000
向前向后查找(Javascript不支持向后查找)
<p>what a funny day</p>
//正则表达式 (?<=<p>).*(?=</p>)
//结果 what a funny day(没有开始和结束标签)