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

匹配可选字符

  • 匹配一个单词的不同写法,如:colorcolour
  • 可选字符:?
    指定的字符、字符组可选,意味着该字符可以出现一次或不出现
/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 不为空
  • 反向后行断言:(?<!表达式)
    不包含某个表达式
  • 有特殊含义的字符匹配的时候需要转义字符:\
    如:\$
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐