乐趣区

学习阅读正则

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

/(?=.*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 任何非空白符的字符

注意点

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

进阶

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

  1. a-zA-Z0-9 ↩
退出移动版