1. 什么是正则表达式 #

在常见的字符串检索或替换中,我们需要提供一种模式表示检索工替换的规则 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串 判断正则是否能匹配给定参数字符串

2. JS正则中的特殊字符 #

需要转义的特殊字符

( [ { \ ^ $ | ) ? * + .

特殊字符说明

特殊字符 说明
$ 匹配输入字符串的结尾位置。请使用 \$
( ) 标记一个子表达式的开始和结束位置,请使用\( \)
* 匹配前面的子表达式零次或多次,请使用 \*
+ 匹配前面的子表达式一次或多次,请使用 \+
. 匹配除换行符\n之外的任何单字符,请使用 \.
[] 标记一个中括号表达式的开始,请使用 \[ 或 \]
? 匹配前面的子表达式零次或一次,请使用 \?
\ 将下一个字符标记为或特殊字符,请使用 \\
^ 匹配输入字符串的开始位置,请使用 \^
{} 标记限定符表达式的开始。请使用 \{
¦ 指明两项之间的一个选择,请使用

3. 预定义的特殊字符 #

字符 描述
\t 制表符
\n 制表符
\r 回车符
\f 换页符
\v 垂直制表符
\0 空字符
\x0B 垂直tab

4. 范围符号 #

符号 含义 示例
[] 字符范围 [a-z] [0-9] [a-z0-9]
[^] 字符范围以外 [^a-z]
^ 行首 ^zfpx
$ 行尾 zfpx$
\b 零宽单词边界 \bhello
\B 非\b \Bhello

5. 预定义类 #

字符 等同于 含义 示例
. [^\n\r] 任意字符 /.../.test('abc')
\d [0-9] 数字0-9 /\d\d\d/.test('123')
\D [^0-9] 非\d,即不是数字0-9 /\D\D\D/.test('abc')
\w [a-zA-Z_0-9] 数字0-9、字母a-z及a-z、下划线 /\w\w/.test('a_')
\W [^a-zA-Z_0-9] 非\W /\W\W/.test('@#')
\s [\t\n\x0B\f\r] 空格、TAB、换页符、换行符 /\sabc/.test(' abc')
\S [^\t\n\x0B\f\r] 非\s /\Sd/.test('a d')

6. 分组 #

符号 含义 示例
(x) 分组,并记录匹配到的字符串 /(abc)/
\n 表示使用分组符(x)匹配到的字符串 /(abc)\1/.test('abcabc')
(?:x) 仅分组不捕获 /(?:abc)(def)\1/.test('abcdefdef');

7.重复 #

符号 含义 示例
a*,a+ 重复次数>=0,重复次数>=1 贪婪算法 /abc*.test('abccc')/
a*? a+? 同a*,a+ 非贪婪算法 /abc*/.test('ab')
a? 出现0次或1次 /a?bc/.test('ab')
a¦b a或者b /a¦b/.test('a')
a{n},a{n,},a{n,m} 重复n次,重复>=n次,重复n<=x<=m /a{2}/.test('aa')

8.前瞻 #

正则 名称 描述
(?=exp) 正向前瞻 匹配后面是exp的位置
(?!exp) 负向前瞻 匹配后面不是exp的位置
(?:exp) 整体匹配 只匹配不想被捕获的时候使用,不能使用 反向引用

var result = 'abbcdefbg'.match(/b+?(?=g)/g); // ['b'] 前面符合正则
var result = 'abbcdefbg'.match(/b+(?!g)/g); // ['bb'] 前面不符合正则

9.标志位 #

/abc/img.test('ABC'); //true
RegExp('abc','img');

/abc/g.global //true
/abc/i.ignoreCase //true
/abc/m.multiline //true
/abc/g.source //true 返回正则的内容
符号 含义
global 匹配所有的情况
ignoreCase 忽略大小写
multiline 跨行匹配

10.RegExp对象方法 #

方法 含义 示例
compile 可以改变正则的内容 var reg = /abc/;reg.compile('def');reg.test('def');//true
exec 用正则匹配字符串获取匹配结果 /abc/.exec('abcdef'); // "abc"
test 如果匹配返回true /ab/.test('ab')
toString 返回正则内容 /ab/.toString()

exec

var str = "school school";
var patt = new RegExp("school",'g');
var result;
while ((result = patt.exec(str)) != null)  {
    console.log(result);
    console.log(patt.lastIndex);
}

11.字符串的正则方法 #

方法 含义 示例
search 查找正则匹配对应的索引 'abcdefabc'.search(/(abc)\1/)
replace 替换 'aabbbcc'.replace(/b+?/); //aa1bbcc
match 匹配 'aabbbccbbb'.match(/b+/g) //
split 分割字符串 'aabbbcc'.split(/b+/); // ["aa","cc"]

match

var path = '/users/:id/:name';
console.log(path.match(/:(\w+)/));
console.log(path.match(/:(\w+)/g));

replace

console.log('/users/:id/:name'.replace(/:\w+/g,'(\\w+)'));

12.扩展阅读 #