横向匹配,匹配的长度是不固定的
1 | abbc abbbc |
纵向匹配,具体到某一字符,也有多种可能
1 | ab1c ab2c |
字符组
范围表示法
1 | [1234][1 - 4]; |
排除字符组
[^ab] 除 ab 以外的任意字符
常见简写形式
\d [0-9] 数字
\D [^0-9] 除数字以外的字符
\w [a-z0-9A-Z_] 数字、大小写字母、下划线
\W 非单词字符
\s 空格
\S 非空格
. 任意字符
量词
{m,} 至少出现 m
{m} 出现 m
? {0,1} 出现或者不出现
- {1,} 出现至少一次,加好追加,先得有一次
- {0,} 出现一次或者任意次
贪婪匹配与惰性匹配
\d{2,5} 数字 2-5
123 12345 123
\d{2,5}? 虽然 2,5 但是有一次就行了
12, 34, 56
惰性匹配只需要给后面加个?
多选分支
a|b|c
abc
good|at 如果匹配 goodat 会匹配到 good,可见也是惰性的,匹配一次,后面就不再匹配
匹配颜色
#af0
#000000
/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g
匹配时间
23:21
05:59
7:9
/^([01][09]|[2][0-3]):[0-5][0-9]/
/^(0?[0-9]|1[0-9]|[2][0-3]):(0?[0-9]|[0-5][0-9])/
匹配日期
1995-03-29
/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/g
window 操作路径
F:\study\javascript\regex\regular expression.pdf
F:\study\javascript\regex
F:\study\javascript
F:\
代表不能为空的文件名 _出现 0 或者任意次{0,} ?可有可无{0,1}
/^[a-zA-F]:\([^\:<>|”?\r\n]+\)([^\:<>|”?\r\n]+)?$/
匹配id
/id=”.*?”/
/id=”(.?)”/
id=”[^”]“
正则表达式匹配 匹配位置和匹配字符
/^|$/g
(?=p) (?!p)
(?=p) 表示p前面的位置
“hello”.replace(/(?=l)/g,”#”)
“he#l#lo”
(?!p)
(?!p) 表示非p前面的位置
“hello”.replace(/(?!p)/g,”#”)
#h#ell#o
位置的特性
1 | "hello" = "" + "" + "hello" |
千分位
12,345,678
/(?!^)(?=(\d{3})+$)/g
12345678 1234556 12,345,678 123,345
/(?!\b)(?=(\d{3})+\b)/g
\b 表示单词和空格之间的距离
不是\b前的位置 (?!\b) \B
/\B(?=(\d{3})+\b)/g
格式化
1800 $ 1,800.00
1 | const format = (num) =>{ |
密码
/(?=.*[0-9])^[a-zA-Z0-9]{6,12}$/ 是否包含数字0-9
/(?=.[0-9])(?=.[a-z])^[a-zA-Z0-9]{6,12}$/ 包含两种
/(?=.*[0-9])^/
表示开头前还有个位置,有任意多个字符,且有数字,简言之字符包含数字
?!p 不包含数字 不包含小写字母 也就是不能单独的存在
/(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)^[a-zA-Z0-9]{6,12}$/
正则括号的作用
分组
(ab)+
分支结构匹配的所有可能性
(a|b|c)
分组引用
用括号包裹表示【存储到的分组数据】
/(\d{3})-(\d{2})/
【提取数据】
string.match(reg)
reg.exec(string)
$1-$9
RegExp.$1 构造函数的全局属性
替换
‘2021-03-29’.replace(/(\d{3})-(\d{2})-(\d{2})/,$2/$3/$1)
03/29/2021
反向引用
2017-06-12”
2017/06/12”
2017.06.12”
2016-06/12”
/\d{4}(-|/|.)\d{2}\1{d}2/
\1 表示前面(-|/|.)匹配到的字符,表示前后两者一致
分组后面有量词会匹配最后一次结果
12345
(\d)+ 5
非捕获括号
(?:p)
1 | let str = 'I love js java node' |
trim 实现
1 | 一个是替换 另一个是提取 |
每个单词的首页字母大写
1 | /(?:^|\s)\w/g $1.toUpperCase |
驼峰
1 | -moz-magic |
逆驼峰化
MozTransform
-moz-transform
1 | /([a-zA-Z])/g, '-$1' |
转义
1 | <>div< |
匹配成对标签
回溯
// 贪婪12345 \d{1,3} 123 \d{1,3} 45
/“.“/ /“[^”]“/减少回溯
// 惰性 ? 尽可能少
// 分支 a|b|c
/^((0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5]).){3}(0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])$/
// 简化
((…).){3} 三位数.三位数.
(0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])
0{0,2}\d 匹配一位数,包括补齐0。 9 09 009 分别0、1 、2三次
0?\d{2} 匹配两位数,包括补齐0。00-99 000-099
1\d{2} 100-199
2[0-4]\d 200-249
25[0-5] 250-255
// 提取公共部分
/this|that/ /th(?is|at)/
// 减少分支数量
/red|read/ /rea?d/
var regex = /^(\d{4})\D(\d{2})\D(\d{2})$/;
var string = “2017-06-26”;
console.log( string.match(regex) );
// =>[“2017-06-26”, “2017”, “06”, “26”, index: 0, input: “2017-06-26”]