JavaScript中的正则内容说多其实也不多,但要全面彻底掌握,也需要花费一些精力。本文的内容不会详细全面讲解,那会是一个颇为庞大的工程。会试着从一些重要概念的角度,梳理一下正则中需要掌握的常用的知识点。
一、正则中的基础概念
1.1元字符
元字符是正则表达式中具有特殊含义的字符,这些字符无法用来代表它们自己本身。例如*号在正则中并不代表*号本身,而表示匹配任意字符。常见的正则元字符如下。
\w 匹配单词字符
\W 匹配非单词字符
\d 匹配数字
\D 匹配非数字
\s 匹配空格
\S 匹配非空格
\b 匹配单词边界
\B 匹配非单词边界
\n 匹配换行符号
\r 匹配回车
\ 正则中用于转义
^ 匹配字符串开头
$ 匹配字符串结尾
1.2字符类
字符类指的是使用元字符'[]'构建的一个匹配范围。例如: /[abcde]/g;代表的是匹配abcde这些字符中的任意一个。 还有一种是反向字符类,代表的是匹配除了字符类中出现的字符以外的任意字符,例如: /[^abc]/g;代表的是匹配除了abc意外任意的字符。
二、正则中的量词
量词的功能是在正则表达式中匹配字符重复出现的次数。主要有
? 匹配字符出现零次或者一次,最多一次
+ 匹配字符出现一次或多次,至少一次
* 出现任意次,零次或者无数次
{n,m} 匹配出现n次到m次的字符,包括n和m
三、正则中的分组
正则中使用元字符()来进行分组,分组的内容可以进行捕获,并在正则中重用。
let reg = /(\d{4})-\1/g;
例如在上述正则表达式中,括号内匹配4个数字就是一个分组,而这个分组匹配到的内容,可以在后续的正则表达式中利用,在这个正则中就是'\1',表示等同于第一个分组。 当然有些情况下,我们不希望某些分组被捕获,如果需要某些分组不被捕获,可以在分组的开始位置加上'?:'。例如。
let reg = /(\d{5})-(?:\d{3})-(\d{1})/g;
上述正则中第二个分组就不会被捕获,后续正则中'\2'引用分组,代表的是(\d{1})这个分组中捕获的内容。
四、贪婪模式和非贪婪模式
正则中的量词默认是贪婪模式,也就是说会尽可能多的匹配符合要求的字符。例如
let str = 'ababababababab';
let reg = /(ab){3,5}/g;
str.replace(reg, 'M'); // Mabab
在可以匹配3个到5个ab的情况下,默认的贪婪模式匹配了5个。
在量词后面加上?可以让正则转为非贪婪模式。同样的例子。
let str = 'ababababababab';
let reg = /(ab){3,5}?/g;
str.replace(reg, 'M'); // "MMab"
五、正向查找和负向查找
正向断言指定了一个必须匹配但不在结果中返回的模式。一个向前查找模式其实就是一个以?=开头的子表达式,需要匹配的文本跟在=的后面。例如。
let str = 'a1bMa2bVa3bKa4bG';
let reg = /(a\db)(?=K)/g;
str.match(reg); // ["a3b"]
(a\db)我们知道是一个子项,匹配的是'a数字b'这样的规则,而子项后面的那个子项就是正向查找,它限定了子项后面的那个位置必须匹配到'K'。符合这个规则的只有'a3b'。