JS -正则教程

1. 精确匹配
let a = /the/;
let b = 'the';
a.test(b); // true

/the/ 精确匹配一次
/the/g 全局匹配
/the/ig 全局忽略大小写匹配

2. 横向模糊匹配
let b = 'the';
let a = /e{1,2}/;
a.test(b); // true
let a = /e{2,3}/;
a.test(b); // false

p{m,n},表示 p 至少连续出现 m 到 n 次(包括m、n)。p 可以是一个子模式,不一定只是一个字符。

/e{1,2}/ e至少出现 1-2 次
/e{2,3}/ e至少出现 2-3 次
/e{2,3}/ e至少出现 2-3 次

需要注意的是

let b = 'thee';
let a = /the{1,2}/;
a.test(b); // true
let a = /(the){1,2}/;
a.test(b); // false

量词有贪婪和惰性之分。{1,3} 这个量词是贪婪的,能满足条件的话,它会尽可能多地匹配。可以在量词的后面加个问号,让其变为惰性的。

let b = 'thethethe';
let a = /(the){1,3}/;   //匹配到一条结果
let c = /(the){1,3}?/;    // 匹配到三条结果
  • * 等价于{0,}。即任意多个。
  • + 等价于{1,}。即至少一个
  • ? 等价于{0,1}。
  • 即有一个或者没有 •{m} 等价于{m,m}
3. 纵向模糊匹配
let b = 'the'';
let c = 'tee';
let a = /t[he]e/; 
a.test(b); // true
a.test(c); // true

[he],这种方括号括起来的模式就是字符集。它是一个集合,匹配“h”或者“e”。又比如我们要找到所有 a 到 e 的字符,可以写成 [abcde]。这种连续的字符也可以简写成 [a-e]。正则里在方括号内开头加上脱字符,来表示取反 [^a-e],匹配一个不是 a、b、c、d、e 的某字符。

常见的简写形式
  • \d 等价于 [0-9]。表示是一位数字。digit 的首字母。
  • \D 等价于 [^0-9]。
  • \w 等价于 [0-9a-zA-Z_]。表示数字、大小写字母和下划线。word的首字母,也称单词字符。
  • \W 等价于 [^0-9a-zA-Z_]。
  • \s 等价于 [ \t\v\n\r\f]。表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。记忆方式:s是space character的首字母。
  • \S 等价于 [^ \t\v\n\r\f]。
  • . 等价于[^\n\r\u2028\u2029]。点是通配符,表示几乎任意字符。
4. 匹配一个具体位置

如果想精准的匹配到某个单词,而不是只匹配到某个单词的一半,比如想匹配 you,不想匹配your,那就要使用边界匹配。

\b。b 是单词 boundary 的首字母。它表示匹配一个位置,这个位置某一边是\w,另一边是\W。也就是一边是单词字符,一边是非单词字符,因此它叫单词边界。
位置也是有反义的。比如 \B 表示非单词边界。

let b = 'thee';
let c = 'the';
let a =/\bthe\b/; 
a.test(b); // false
a.test(c); // true

除了单词边界这种位置之外,估计大家应该知道 ^ 和 $。它匹配整个文本的开头和结尾。如果想找到所有行开头的 we 单词,可以使用多行模式。
/m,是 multiline 的首字母,表示多行匹配。所谓多行匹配,就是说 ^ 和 $,可以匹配行开头和行结尾,不再局限于整个文本的开头和结尾。

let b = '
thee
thee
';
let a =/^the/m/; 

除了 \b、\B、^、$ 外,还有一种断言位置。
(?=p),表示模式 p 前面的位置。(?!p)是其反义。
(?<=p),表示模式 p 后面的位置。或者说该位置的后面是 p。它也有反义的形式 (?<!p)。

5. 引用

street 里有两个 e,而 all 里有连个 l。此时我想找到所有这样的双棒字母,该怎么做呢?直接使用 .{2} 是不行的。因为它就是 … 的简写形式,表示两个任意字符。并没有要求这两个字符相同。

let b = 'thee';
let c = 'the';
let a =/.{2}/; 
a.test(b); // true
a.test(c); // true

此时,就涉及到了反向引用。
\1 是反向引用,表示第一个括号里捕获的数据。那么 \2 呢,表示第二个括号捕获的。

let b = 'thee';
let c = 'the';
let a =/(.)\1/; 
a.test(b); // true
a.test(c); // false
6. 分支结构

管道符 |,表示或的关系,多选一。它从左到右面一个个尝试,如果成功,就不再继续尝试了。可以说它是短路的、惰性的。比如用 you|your 去匹配 your 时,它只会匹配到 your 的前 3 个字母。所以分支顺序不同结果可能也会不同。

7.参考链接

正则极简教程
JS正则迷你书

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值