应用
- 输入校验
- AST 抽象语法树
- liunx命令
创建一个正则表达式
- 使用正则表达式字面量
const regex = /^d{11}&/
- 使用构造函数
const regex = new RegExp(/^d{11}&/, "gi")
如何判断正则表达式的类型?
- typeof
- instanceof RegExp
基础知识
元字符 必记
- . 匹配 以外的任意字符
- w 字母数字下划线 (a-zA-Z0-9_)
- W 非字母数字下划线
- d 数字 (0-9)
- D 非数字
- s 任意不可见字符 如空格 制表符 换行符
- S 任意可见字符
- ^ 开始符 // 字符集里第一位代表 非
- $ 结束符
量词——关于数量的词
- {n} n次
- {n, } 至少n次
- {n,m} n到m次
- * 重复任意次 相当于{0,}
- ? 0-1次 {0,1}
- + 至少1次 {1,}
分支和字符集合
- (ax|by|cz) 分支
- [abc] === [a-c] 字符集合
- [^abc] === [^a-c] 字符集合
- a-c 代表 abc
- [] === [x00-xff] x代表十六进制
- [] === [u0000-u00ff] u unicode编码
- 中文字符[u4e00-u9fa5] unicode编码起始-结束
修饰符
- g global
var str = 'ha ha ha';
var result = str.replace(/ha/, 'Hello');
var gResult = str.replace(/ha/g, 'Hello');
console.log(str); // "ha ha ha"
console.log(result); // "Hello ha ha"
console.log(gresult); // "Hello Hello Hello"
- i ignoreCase
- m multiline 多行
- y sticky [es2016]
- u unicode [es2018]
- s dotAll [es2018]d
高级
转义
- 哪些字符需要转义? 一般产生歧义的字符都需要转义,常见转义符号如下
- .
- ^
- $
- *
- ?
- +
- {}
- ()
分组&引用
-
/(d{4})-(d{2})-(d{2})/ 分组,分三组
-
/(d{4})-(d{2})-2/
2分组,对前两组的引用 内容一样非表达式一样
const result = /(d{4})-(d{2})-(d{2})/.exec('1111-22-33')
result[0] // '1111-22-33'
result[1] // '1111'
result[2] // '22'
result[3] // '33'
- 具名分组 // [es2018]
const res = `1111-22-33`.match(/(?<year>d{4})-(?<month>d{2})-(?<day>d{2})/)
console.log(res)
{
0: '1111-22-33',
1: '1111',
2: '22',
3: '33',
groups: {
year: 1111,
month: 22
day: 33
}
}
console.log(res.groups) // {year: "1111", month: "22", day: "33"}
- replace
`1111-22-22`.replace(/(d{4})-(d{2})-(d{2})/, `$1/$2/$3`)
// 1111/22/33
- RegExp.$[_1-9]
- ?: 分组不引用
- 单词边界
方法
- test 测试是否匹配的RegExp方法,返回true或false
- exec RegExp方法,返回数组或null
- match 字符串方法,返回数组或null
- replace 字符串方法,返回替换后的结果字符串,不更改原字符串
lookaround assertions (零宽断言/环视)
- 根据方向 分为 lookahead和lookbehind
- 根据判定原则, 分为肯定和否定
-
正向 肯定 ?=pattern 如果pattern匹配 整个表达式匹配
-
正向 否定 ?!pattern 如果pattern匹配 整个表达式不匹配
-
反向 肯定 [es2018] ?<=pattern
-
反向 否定 [es2018] ?<!pattern
惰性 & 贪婪
- 贪婪模式 在匹配成功的前提下,尽可能多的去匹配。 匹配优先量词
- 惰性模式 在匹配成功的前提下,尽可能少的去匹配。 匹配忽略优先量词