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 个字母。所以分支顺序不同结果可能也会不同。