先看下下面几张图的共同点:
/(?=.*d)(?=.*[A-Z])(?=.*W)(?=.*[a-z])(?=.*S)^[0-9A-Za-zS]{6,12}$/g
个人理解:正则的基础匹配如同坐标轴一样,有横向匹配,纵向匹配,位置匹配;
量词 (横向)
字符 | 匹配 |
---|---|
{n,m} | 匹配至少 n 次,但不能超过 m 次 |
{n,} | 匹配 n 次或者更多次 |
{n} | 匹配 n 次 |
? | 匹配 0 或者 1 次,等价于{0,1} |
+ | 匹配 1 次或者多次,等价于{1,} |
* | 匹配 0 次或者多次,等价于{0,} |
惰性量词:?
/a+/ //mach
匹配模式 g (global)
/a/
/a/g
字符组(纵向)
字符 | 匹配 |
---|---|
[abcdefg…] | 匹配 abcdefg… 的任意一个 |
. | 除换行符和其他 Unicode 行终止符之外的任意单个字符 |
w | 等价于[a-zA-Z0-9] |
W | 等价于1 特殊字符 |
s | 任何空白符 |
S | 任何非空白符的字符 |
d | 阿拉伯数字 0 -9 |
D | 非阿拉伯数字 |
基础字符
字符 | 匹配 |
---|---|
字母和数字字符 | 自身 |
t | 制表符 |
n | 换行符 |
v | 纵向空白符 |
f | 换页符 |
r | 回车符 |
0 | 空字符 |
[b] | 退格符 |
\ | 匹配时按文本形式来识别其后的任何元字符或 / 分隔符(转义字符) |
分支 (选择和分组)
1. 选择 “|”
一个模式可以实现横向和纵向模糊匹配。而多选分支可以支持多个子模式任选其一。
具体形式如下:(p1|p2|p3),其中 p1、p2 和 p3 是子模式,用 |(管道符 )分隔,表示其中任何之一。需要注意的是,选择项的匹配次序是 从左到右,直到发现了匹配项。如果左边的选项匹配,那么就会忽略右边的匹配项。跟 js 的短路运算(||) 是一样的。因此,当 / a|ab / 匹配“ab”时,只会匹配第一个字符。
/ab|cd/ 既可以匹配 ab 也可以匹配 cd
2. 分组 “()”
把 单独的项组合成独立的子表达式,以便可以像处理一个独立的单元那样用 “|”、”*”、”+” 或者 “?” 来对单元内的项进行处理。例如:
/(ab)+(cd){1}/ 可以匹配 'ab' 多次加上一次 cd
锚点 (位置)
如何匹配确定数量的字符?如:匹配一个 a
/a/.test("aaaaaaaaaaaaaaaaaaa")
使用 锚点 将匹配字符串的特定位置。其中最常用的是使用 ‘^’ 匹配字符串的开始,使用 ‘$’ 匹配字符串的结束。
任意正则表达式 都可以作为锚点条件。
直观的感受位置:var result = "hello".replace(/(?=l)/g, '--------');
console.log(result); ^ 这个 $ 同理
带有 “(?!)” 的断言是负向先行断言,用以指定接下来的字符都不必匹配。
var result = "hello".replace(/(?!l)/g, '--------');
console.log(result);
位置应用例子:
// 数字千位分隔符
"12345678" => "12,345,678"
// 6 到 12 位同时包含特殊字符,大小写字母和数字且不包含空白符
// \W 特殊字符
// \S 任何非空白符的字符
注意点
- 多个简写字符组相邻存在时需要写入 [] 里面:
/\d\s/ 而应该是 /[\d\s]/
进阶
- 回溯法原理 贪婪量词 惰性量词
- 平衡法则
- 准确性 效率
- 构建动态正则表达式
- a-zA-Z0-9 ↩