# 正则表达式
在常见的字符串检索或替换中,我们需要提供一种模式表示检索工替换的规则 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串 判断正则是否能匹配给定参数字符串
# 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) //["bbb", "bbb"] split | 分割字符串 | 'aabbbcc'.split(/b+/); // ["aa","cc"]
//match例子:
var path = '/users/:id/:name';
console.log(path.match(/:(\w+)/));
console.log(path.match(/:(\w+)/g));//如果加g的话不会捕获小分组内容
//replace例子:
console.log('/users/:id/:name'.replace(/:\w+/g,'(\\w+)'));