常用字符
- [0-9]匹配单个数字0-9
- [a-z]匹配单个小写字母
- [A-Z]匹配单个大写字母
- \s匹配所有空白字符,如空格换行
- \n匹配所有换行符
- \b匹配边界如字符之间的空格
- \d匹配一个数字
- \w匹配一个字母或数字
特殊字符
- ^ 匹配输入字符串的开始位置,用在[]中表示非 1、/^http/匹配以http开头的字符串2、/[^a-zA-Z]/匹配非字母
- $ 匹配输入字符串的结尾位置 /.com$/匹配以.com结尾的字符串
- | 或 /a|b/匹配a或b
- . 小数点匹配换行符\n之外的任何单个字符 /./匹配换行符之外的其他字符
- [] 中括号匹配一个字符 /[csgorushb]/匹配字母csgorushb中的一个
- () 小括号表示一个子表达式分组 匹配的子表达式可以用于以后使用
- {} 大括号表示限定一个表达式多少次 {n}匹配n次;{n,}匹配最少n次;{n,m}匹配n-m次
+
匹配前面的子表达式一次或多次 /[0-9]+/匹配一个数字或多个数字*
匹配前面的子表达式0或多次 /[0-9]* /匹配0或多次数字- ? 匹配前面表达式0次或一次,指明一个非贪婪限定符 1、/[0-9]?/ 2、/<.*?>/匹配一个标签如
<p>
匹配特殊字符本身时需要转义,共有以下几个:
* . ? + $ ^ [ ] ( ) { } | \ /
其中/
在字面量中需要转义,在构造函数中不需要,如下匹配一个斜杠/
1 | const reg = /\// |
在字面量中带一个转义符\
的用构造函数写要带两个转义符 \\
,如下匹配一个字符串:
1 | const reg = /\./ |
常用方法
字面量
1 | const reg = /[0-9a-z]/g; |
经常会用reg.test(str)
方法来判断字符串中是否匹配到了正则表达式
1 | const reg3 = /[0-9]/g; |
也经常用str.replace(reg, '')
方法来替换字符串中的内容:
1 | if (reg3.test(str)) { |
也会用到str.match(reg)
方法来获取匹配到的内容(也可以用reg.exec(str)
1 | const reg4 = /[0-9]+[.][0-9]+[.][0-9]+/g; |
贪婪&非贪婪
+
和*
限定符都是贪婪的,它们会尽可能多的匹配文字。在它们的后面加上一个?
就可以实现非贪婪或最小匹配
贪婪-默认都是贪婪的
1 | const str3 = '<h1>正则表达式</h1>' |
非贪婪
1 | const str4 = '<h1>正则表达式</h1>'; |
捕获分组和回溯引用
小括号
()
匹配到的子表达式会被缓存为一个个组,方便后面对其引用
假设要获取html
中的h1
标签:
在正则表达式中使用\n可以引用第n个捕获组
1 | const str5 = '<p>正则表达式</p><h1>正则表达式</h1><h2>正则表达式</h2>' |
在正则表达式外使用$n引用第n个捕获组(RegExp.$n);
1 | const str6 = 'abc'; |
非捕获分组和限定查找
因为捕获组
()
会将每个捕获到的结果缓存下来以便引用,所以会造成内存使用增加。如果只是想用分组的原始功能,而不需要缓存,则可以使用非捕获分组(?:)
1 | const str7 = 'abc'; |
前向查找-前向查找是用来限制后缀的
(?=)
:即查找符合限定条件(?=)
的前面的匹配项(输出内容不包括(?=)
中的匹配项)
1 | const str8 = 'a.png b.jpg c.fig d.svg'; |
(?!)
:即查找不符合限定条件(?!)
的前面的匹配项(输出内容不包括(?!)
中的匹配项)
1 | const str9 = 'a.png b.jpg c.fig d.svg'; |
后向查找-后向查找是用来限制前缀的
查找符合限定条件
(?<=)
的后面的匹配项(输出内容不包括(?<=)
中的匹配项)
1 | const str10 = '1. 1111; 2. 2222; 3. 3333; 4. 4444。' |
查找 不符合 限定条件
(?<!)
的后面的匹配项(输出内容不包括(?<!)
中的匹配项)
1 | const str11 = 'a.png b.jpg c.gif d.svg'; |
例子
前向查找和后向查找齐用
假设要获取<img crossorigin src="https://abcdefg.com" data-img-url="https://test.com">
中的data-img-url
属性中的链接。可以确定的是链接左边一定是 data-img-url=" ,
右边一定是紧贴着"
(非贪婪)
1 | const str12 = '<img crossorigin src="https://abcdefg.com" data-img-url="https://test.com">' |
回溯引用和非贪婪并用
假如我要获取一段html
中的文本,但是我又不想要加了 not-show-in-text
标记的标签中的文本
1 | const notShowInText = 'not-show-in-text'; |
replace第二个参数可以是回调函数
比如,想把yyyy-mm-dd
格式,替换成mm/dd/yyyy
怎么做?
1 | const regex = /(\d{4})-(\d{2})-(\d{2})/; |
等价于如下的形式:
1 | const result2 = string.replace(regex, function() { |
也等价于:
1 | const result3 = string.replace(regex, function(match, year, month, day) { |