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);
var result = 'abbcdefbg'.match(/b+(?!g)/g);
9.标志位 #
/abc/img.test('ABC');
RegExp('abc','img');
/abc/g.global
/abc/i.ignoreCase
/abc/m.multiline
/abc/g.source
符号 |
含义 |
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.扩展阅读 #