#Specify RegularExprssion(正则详解-萧淳元)
###step1 两种创建形式
- 字面量
let pattern = /模板字符串/igm; (字符串模板是写死的)
- 构造函数
let pattern = new RegExp(‘模板字符串’,igm); (字符串模板可以使用参数方式传入)
[igm是匹配模式]
###step2 让正则去匹配字符串
######匹配的执行有两种方式
- pattern.test(“模板字符串”)
- pattern.exec(“模板字符串”)
区别
test()方法返回的ture或false
exec()返回的是匹配到的字符串数组
###step3 转义字符
如果需要匹配具有特殊意义的字符需要使用\符号来转译
###step4 字符类
顾名思义就是一类字符,和一类字符进行匹配如果匹配上一个即为匹配成功.
let pattern = /[jsabcd]/
let orgain = ‘bcd’
字符类使用中括号表现,如使用pattern去匹配orgain,匹配到b即为成功,如果没有b匹配到c即为成功如果没有c匹配到d即为成功。总之只要orgain字符串中含有[]中的字母都可以匹配成功。
取反
let pattern = [^jsp]
匹配字符串中除了jsp之外的所有字符。
如果需要匹配26个英文字母 let pattern =/[a-zA-Z]/ 前面字母的一定要比后面的小
匹配所有的数字 let pattern = /[0-9]/
**.**可以匹配到处理\n之外所有的字符。
#####一些简写
正则 | 简写 |
---|---|
/[a-zA-Z0-9_]/ | / \w / |
/1/ | / \W / |
/[0-9]/ | / \d / |
/[^0-9]/ | / \D / |
匹配空白字符 | / \s / |
除了空白字符外的所有字符 | / \S / |
###step5 重复
比如需要匹配9527这个数字,我们没有必要按照常规的/[\d\d\d\d]/这样写四次,
可以使用量词**/[\d{3}]/
如果需要匹配一位或者两位的话/[\d{1,2}]/
匹配至少一个 /[\d{1,}]/或者/\d+/
匹配零个或者一个/\d?/
匹配零次或者更多/[\d{0,}]/或者/\d*/**
###step6 非贪婪重复
正则在默认情况下都是贪婪的,就是在使用量词是候会尽可能多的匹配。
ex. 用/\a+/ 去匹配 ‘aaabb’ 默认情况下会匹配出aaa,尽可能多的匹配。
转换成非贪婪匹配
在量词后面加上**?**即可将其转换为非贪婪匹配。
###step7 选择
相当于或运算
ex. let pattern = /js|css|python|java/;
let origin = ‘css’ 结果为css
pattern的意思是待匹配的字符串中只要有js,css,python,java中任意一个即算是匹配成功。
###step8 分组
分组是将字符作为一组来进行匹配
ex. let origin = ‘ababab’
let pattern = /(ab)+/ 结果:[ababab,ab]
结果中的第一个元素时分组匹配的结果,之后的元素是有几个分组就会对应几个匹配。
let origin = ‘abbbbba’
let pattern = /(a)(.*)\1/
["annnnna", "a", "nnnnn"]
元素0:整个正则匹配到的元素
元素1:第一个分组匹配到的元素
元素2:第二个分组匹配到的元
’\1’为引用第一个分组的模式
###step9 位置匹配
- 首匹配
ex. let pattern = /^js/表示待匹配字符串的首位字符必须是j且j后面的一个字符必须是s,否则匹配不成功。
- 尾匹配
ex. let pattern = /jsKaTeX parse error: Undefined control sequence: \d at position 82: …et pattern = /^\̲d̲+/ 表示待匹配的字符串必须从头到尾都是数字。
- 单词之间的匹配
ex. let str = ‘js html’
let pattern = /js\b/ 说明:这里的\b是\w和\W之外的字符比如空字符或@%#这些
- 前瞻性匹配
ex. let origin = ‘typescript’
let pattern = /type(?**=**script)/
只有当origin中type后跟着是script才匹配origin中的type。
- 负向前瞻性
ex. let origin = ‘typescript’
let pattern = /type(?**!**script)/
说明:当origin字符串中type后如果跟着script则匹配不到origin中的type。和前瞻性匹配逻辑相反。
###step10 再次了解RegExp对象
- 使用new RegExp创建匹配模板是,如果涉及到特殊字符需要双重转译
比如需要匹配\则需要new RegExp(’\\’)来创建匹配\的模板。
a-zA-Z0-9_ ↩︎