# 正则表达式

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

# 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+)'));

# 12. 参考