JavaScript中的正则内容说多其实也很少,但要全面完全掌握,也须要花费一些精力。本文的内容不会详细全面讲解,那会是一个颇为庞大的工程。会试着从一些重要概念的角度,梳理一下正则中须要掌握的经常使用的知识点。正则表达式
元字符是正则表达式中具备特殊含义的字符,这些字符没法用来表明它们本身自己。例如*号在正则中并不表明*号自己,而表示匹配任意字符。常见的正则元字符以下。bash
\w 匹配单词字符
\W 匹配非单词字符
\d 匹配数字
\D 匹配非数字
\s 匹配空格
\S 匹配非空格
\b 匹配单词边界
\B 匹配非单词边界
\n 匹配换行符号
\r 匹配回车
\ 正则中用于转义
^ 匹配字符串开头
$ 匹配字符串结尾
复制代码
字符类指的是使用元字符'[]'构建的一个匹配范围。例如: /[abcde]/g;表明的是匹配abcde这些字符中的任意一个。 还有一种是反向字符类,表明的是匹配除了字符类中出现的字符之外的任意字符,例如: /[^abc]/g;表明的是匹配除了abc意外任意的字符。ui
量词的功能是在正则表达式中匹配字符重复出现的次数。主要有spa
? 匹配字符出现零次或者一次,最多一次
+ 匹配字符出现一次或屡次,至少一次
* 出现任意次,零次或者无数次
{n,m} 匹配出现n次到m次的字符,包括n和m
复制代码
正则中使用元字符()来进行分组,分组的内容能够进行捕获,并在正则中重用。code
let reg = /(\d{4})-\1/g;
复制代码
例如在上述正则表达式中,括号内匹配4个数字就是一个分组,而这个分组匹配到的内容,能够在后续的正则表达式中利用,在这个正则中就是'\1',表示等同于第一个分组。 固然有些状况下,咱们不但愿某些分组被捕获,若是须要某些分组不被捕获,能够在分组的开始位置加上'?:'。例如。ip
let reg = /(\d{5})-(?:\d{3})-(\d{1})/g;
复制代码
上述正则中第二个分组就不会被捕获,后续正则中'\2'引用分组,表明的是(\d{1})这个分组中捕获的内容。字符串
正则中的量词默认是贪婪模式,也就是说会尽量多的匹配符合要求的字符。例如string
let str = 'ababababababab';
let reg = /(ab){3,5}/g;
str.replace(reg, 'M'); // Mabab
复制代码
在能够匹配3个到5个ab的状况下,默认的贪婪模式匹配了5个。
在量词后面加上?可让正则转为非贪婪模式。一样的例子。class
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'。