正则表达式全解(必会)
1.字符组匹配字符组中的任意一个字符/[Pp]ython/g匹配:Python、python注意:字符组只匹配一个,不是同时匹配Pp这两连接的字符,Ppython,只能匹配到后面部分python字符组中的-表示区间范围/[0-9]/g匹配所有数字[A-Za-z]匹配所有字母匹配特殊字符:转义字符 \// 匹配所有字母和 横[A-Za-z\-]匹配所有字母取反:^// 匹配所有 非数字:/[^0-9
·
1.字符组
- 匹配字符组中的任意一个字符
/[Pp]ython/g
匹配:Python、python
注意:字符组只匹配一个,不是同时匹配Pp这两连接的字符, Ppython,只能匹配到后面部分python
- 字符组中的
-
表示区间范围
/[0-9]/g匹配所有数字
[A-Za-z]匹配所有字母
- 匹配特殊字符:转义字符
\
// 匹配所有字母和 横
[A-Za-z\-]匹配所有字母
- 取反:
^
// 匹配所有 非数字:
/[^0-9]/g
// 匹配所有 非小写字母:
/[^a-z]/g
// 匹配所有 爱后面不包含 你
/爱[^你]/g
快捷方式
- 匹配所有数字:
\d
- 匹配所有字母:
\w
匹配所有数字
/\d/g
- 匹配空白:
\s
包含:空格。tab。换行 - 匹配单词边界:
\b
有时候需要匹配某个完整的单词,但会存在该单词和其他单词的词组,则可以使用单词边界
/\bmaster\b/g
- 快捷方式取反:大写字母就是小写字母的取反
匹配非数字:\D
匹配非字母:\W
匹配非空白:\S
匹配开始和结束
- 开始:
^
这个符号放到字符组中表示取反,在字符组外表示匹配开始
匹配以python开头的字符
/^python/g
以下字符串只有第一个可以匹配到:
python slfaksfhaksfaj phthon
phthonsafalsfhsakkfahjkahfaksalpython
- 结尾:
$
匹配以python结尾的字符
/python$/g
以下字符串只有最后一个可以匹配到:
python slfaksfhaksfaj phthon
phthonsafalsfhsakkfahjkahfaksalpython
匹配任意字符
- 任意字符匹配:
.
这个点可以匹配任意字符:数字、字母、文字等
换行不能匹配到
/....../g
可以匹配到连续的六个字符:python
匹配任意字母后是ar的字符串
/.ar/g
匹配可选字符
- 匹配一个单词的不同写法,如:
color
、colour
- 可选字符:
?
指定的字符、字符组可选,意味着该字符可以出现一次或不出现
/honou?r/g
表示 u 可以出现也可以不出现,则匹配:honor、honour
字符重复次数
- 字符连续匹配好几次,则在字符组后面加上:
{n}
表示希望它之前的字符组出现N次 - 重复区间:
{n,m}
{8,9}
重复8次或重复9次 - 非贪婪模式:
{n,m}?
没有问号时就是贪婪模式,有m个字符就匹配m个
匹配连续九个数字
/\d{9}/g
匹配特定格式号码 xxx-xxxxx
/\d{3}-\d{5}/g
匹配特定格式号码 xxxx-xxxxx 或 xxx-xxxxx
/\d{3,4}-\d{5}/g
- 开区间:
{n,}
匹配n个及以上的字符 - 加号:
/\d+/
上面开区间的简写,不需要花括号和逗号
表示:1 - 无穷大 *
号:/\d*/
表示: 0 - 无穷大
匹配以 f 开头的数据
/f.+/g
匹配手机号和网址
匹配所有的电话号码
要求:1、必须是 11 位数字
2、第一位数字必须要以1开头,后面的可能是[3,4,5,7,8,9],后满9个数字是[0-9]中间的任意一个
/^1[345789][0-9]{9}/g
匹配网址
要求:以http开头,以 / 结尾的所有数据
提示:.* 任意字符出现0次及以上
/^http.*/$/
分组
- 实现分组:
()
- 分组的重要功能:捕获数据
所以被成为捕获分组
匹配下方字符串,提取出 hi 这个数据
<div>hi</div>
错误方法:
/<div>.*?</div>/g
错误原因:可以匹配到字符,但无法提取数据
正确方法:
/<div>(.*?)</div>/g
提取p标签里面的数据
/<p>(.*?)</p>/
提取学号
(\d{4})[\-\s]?(\d{4})[\-\s]?(\d{2})
提取年月日的数据
/(\d{4})[\-/](\d{1,2})[\-/](\d{1,2})/
- 典型案例:提取 video 标签中的视频链接
contentArr = richtext.split(/<video [^>]*src=['"]([^'"]+)[^>]*><\/video>/)
或者条件
- 在使用分组的同时可以使用或者条件
- 使用:
|
表示或者
不同后缀名
/(.jpg|.gif|.jpeg|.png)/g
非捕获分组
- 不需要捕获数据,又想要使用分组的特性
- 使用:
(?:表达式)
匹配相应格式的号码,但只需要横后面的号码
01-45354
0731-45687
12345-45634
tel:412542
/(?:\d{2}|\d{4}|\d{5}|tel)[\-:](\d{5})/g
分组的回溯引用
- 有时候会寻找一个字匹配,该匹配接下来还会再次出现
- 回溯:
\n
匹配第n个分组的内容
想要匹配以下正确的html标签,并提取里面的文字
123<font>提示</bar>asjfha
123<font>提示</font>asjfha
错误提取:
/<\w+>(.*?)</\w+>/g
错误原因:该提取方法会提取到第一个错误的标签,因为它也符合格式
正确提取:
/<(\w+)>(.*?)</\1>/g
\1 匹配第一个分组的内容,则该字符和第一个分组匹配到的字符要一样才可以匹配
匹配 ab ba 这样关系的单词
/(\w)(\w)\2\1/g
环视:断言
- 正向先行断言:
(?=表达式)
指在某个位置向右看,表示所在位置右侧必须能匹配 表达式,但不会提取到该表达式 - 现行断言可以判断某个字符串是否符合特定的规则
例如:提取至少包含一个大小写字母的字符串 - 常用语:密码强度验证
至少一个大写字母
至少一个小写字母
字符串:我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要提取出喜欢两个字,要求这个喜欢后面有你
/喜欢(?=你)/g
此时会匹配第1和和最后一个喜欢,但不会提取你字
提取至少包含一个大、小写字母的字符串
/(?=.*?[a-z])(?=.*[A-Z]).+/
表示:断言后面可以是任意字符,但小写字母必须出现一个
第二个断言相似,必须要出现一个大写字母
- 反向先行断言:
(?!表达式)
保证右边不出现某个字符
字符串:我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要提取出喜欢两个字,要求这个喜欢后面不能有你
/喜欢(?!你)/g
此时会匹配第2,3,4个喜欢
匹配非qq邮箱的数据
abc@sina.com
qq@163.com
- 正向后行断言:
(?<=表达式)
先行断言从左往右看,后行断言从右往左看
匹配:喜欢前面有我,后面有你
/(?<=我)喜欢(?=你)/
匹配王姓同学的名字
/(?<=王)\S/g
\S 不为空
- 反向后行断言:
(?<!表达式)
不包含某个表达式 - 有特殊含义的字符匹配的时候需要转义字符:
\
如:\$
更多推荐
已为社区贡献2条内容
所有评论(0)