1

先看下下面几张图的共同点:

timg 1.jfif

timg 2.jfif

timg.jfif

/(?=.*d)(?=.*[A-Z])(?=.*W)(?=.*[a-z])(?=.*S)^[0-9A-Za-zS]{6,12}$/g
image 1.png

个人理解:正则的基础匹配如同坐标轴一样,有横向匹配,纵向匹配,位置匹配;

量词 (横向)

量词横向.png

字符 匹配
{n,m} 匹配至少n次,但不能超过m次
{n,} 匹配n次或者更多次
{n} 匹配n次
? 匹配0或者1次,等价于{0,1}
+ 匹配1次或者多次,等价于{1,}
* 匹配0次或者多次,等价于{0,}

惰性量词:?

/a+/ //mach
匹配模式 g (global)
/a/
/a/g

字符组(纵向)

字符组纵向.png

字符 匹配
[abcdefg...] 匹配abcdefg...的任意一个
. 除换行符和其他Unicode行终止符之外的任意单个字符
w 等价于[a-zA-Z0-9]
W 等价于1 特殊字符
s 任何空白符
S 任何非空白符的字符
d 阿拉伯数字0-9
D 非阿拉伯数字

基础字符

字符 匹配
字母和数字字符 自身
t 制表符
n 换行符
v 纵向空白符
f 换页符
r 回车符
0 空字符
[b] 退格符
\ 匹配时按文本形式来识别其后的任何元字符或/分隔符(转义字符)

分支 (选择和分组)

分支选择.png
1. 选择 "|"

一个模式可以实现横向和纵向模糊匹配。而多选分支可以支持多个子模式任选其一。
具体形式如下:(p1|p2|p3),其中 p1、p2 和 p3 是子模式,用 |管道符)分隔,表示其中任何之一。需要注意的是,选择项的匹配次序是从左到右,直到发现了匹配项。如果左边的选项匹配,那么就会忽略右边的匹配项。跟js的短路运算(||) 是一样的。因此,当/ a|ab / 匹配“ab”时,只会匹配第一个字符。
/ab|cd/ 既可以匹配ab也可以匹配cd

2. 分组 "( )"
分组.png

单独的项组合成独立的子表达式,以便可以像处理一个独立的单元那样用 "|"、"*"、"+" 或者 "?" 来对单元内的项进行处理。例如:
/(ab)+(cd){1}/ 可以匹配'ab'多次加上一次cd

锚点 (位置)

锚点位置.png

如何匹配确定数量的字符 ?如:匹配一个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 任何非空白符的字符

注意点

  1. 多个简写字符组相邻存在时需要写入 [ ] 里面:
/\d\s/ 而应该是 /[\d\s]/

进阶

  1. 回溯法原理 贪婪量词 惰性量词
  2. 平衡法则
  3. 准确性 效率
  4. 构建动态正则表达式

  1. a-zA-Z0-9

fsme
781 声望3 粉丝

引用和评论

0 条评论