JavaScript 中的正则表达式用 RegExp 对象表示。
JS中定义正则表达式的两种方法:
| 方法 | 示例 | 
|---|---|
RegExp 对象 | 
var pattern = new RegExp("s"); | 
| 直接量 | var pattern = /s/; | 
正则表达式中的所有字母和数字都是按照字面含义进行匹配的,同样也支持非字母数字的字符匹配,这些字符需要通过反斜线 ‘\‘ 作为前缀进行转义。
除了字母和数字之外的字符都需要通过反斜线
\来转义。
正则表达式中的直接量字符:
| 直接量字符 | 匹配 | 
|---|---|
| 字母和数字字符 | 自身 | 
| \o | NUL字符(\u0000) | 
| \t | 制表符(\u0009) | 
| \n | 换行符(\u000A) | 
| \v | 垂直制表符(\u000B) | 
| \f | 换页符(\u000C) | 
| \r | 回车符(\u000D) | 
| \xnn | 由16进制数nn指定的拉丁字符,例如,\x0A等价于\n | 
| \uxxxx | 由16进制数xxxx指定的Unicode字符,例如\u0009等价于\t | 
将直接量字符单独放在方括号内就组成了字符类。
正则表达式中的字符类:
| 字符类 | 匹配 | 
|---|---|
| [...] | 方括号内的任意字符 | 
| [^...] | 不在方括号内的任意字符 | 
| . | 除换行符和其它Unicode行终止符之外的任意字符 | 
| \w | 任何ASCII字符组成的单词,等价于 [a_zA-Z0-9] | 
| \W | 任何不是ASCII字符组成的单词,等价于 [^a-zA-Z0-9] | 
| \s | 任何Unicode空白符 | 
| \S | 任何非Unicode空白符 | 
| \d | 任何ASCII数字,等价于 [0-9] | 
| \D | 除了ASCII数字之外的任何字符,等价于 [^0-9] | 
正则表达式中的重复字符:
| 重复字符 | 含义 | 
|---|---|
| {n,m} | 匹配前一项至少n次,但不超过m次 | 
| {n,} | 匹配前一项n次或更多次 | 
| {n} | 匹配前一项n次 | 
| ? | 匹配前一项0次或1次,等价于 {0,1} | 
| + | 匹配前一项1次或多次,等价于 {1,} | 
| * | 匹配前一项0次或多次,等价于 {0,} | 
默认为贪婪匹配,若要实现非贪婪匹配,只需在待匹配的项后面加1个 ? 即可。
详细说明见贪婪匹配和非贪婪匹配。
正则表达式中的选择、分组和引用字符:
| 字符 | 含义 | 
|---|---|
| | | 选择,匹配的是该符号左边或右边的子表达式 | 
| (...) | 组合,将几个项组合成一个单元,可以记住和这个组合相匹配的字符串。var result = ‘JavaScript‘.match(/(Java)Script/) result[0] = ‘JavaScript‘  result[1] = ‘Java‘   result[1] 中的内容就是(Java)组合中匹配到的字符串 | 
| (?:...) | 把几个项组合成一个单元,但是不记住和这个组合相匹配的字符串 | 
| (\n) | 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也可能是嵌套的),组索引是从左到右的做括号数。 /([‘"])[^‘"]*\1/这样当 ([‘"]) 中匹配的是单引号时,\1 就是单引号,当 ([‘"]) 中匹配的是双引号时,\1 就是双引号,这样保证了前后的一致性。 | 
| (?<name>)(提案) | 具名组                                                                                                                                               格式:“问号+尖括号+组名”                                                                                                                    作用:为每一个组匹配指定一个名字 ,可以通过exec方法返回结果的groups属性上引用该组名                                                                                                                                                        示例1: let result = /(?<year>\d{4})-(?<month>\d{2})/.exec(‘2019-10‘); // result=[‘2019-10‘,‘2019‘,10]  result.groups={year:‘2019‘, month:‘10‘}                                                   注意:如果要在正则表达式内部引用某个“具名组匹配”,可以使用 \k<组名> 的写法,同时数组引用也依然有效                                                                                                                               示例2:let result = /^(?<word>[a-z]+)!\k(word)!\1$/.test(‘abc!abc!abc‘) // true           let result = /^(?<word>[a-z]+)!\k(word)!\1$/.test(‘abc!abc!ab‘) // false | 
正则表达式中的锚字符:
| 字符 | 含义 | 
|---|---|
| ^ | 匹配字符串的开头,在多行匹配(有修饰符m)中匹配每一行的开头 | 
| $ | 匹配字符串的结尾,在多行匹配(有修饰符m)中匹配每一行的结尾 | 
| \b | 匹配一个单词的边界,简言之,就是位于字符 \w 和 \W 之间的位置,或位于字符 \w 和字符串的开头或者结尾之间的位置(但需要注意, [\b]匹配的是退格符) | 
| \B | 匹配非单词边界的位置 | 
| (?=p) | 零度正向先行断言,要求接下来的字符要与p匹配,并且匹配的结果不包含p,如 var result = ‘JavaScript:a‘.match(\JavaScript(?=:)\)   匹配结果: result[0]=‘JavaScript‘  JavaScript 后面要紧跟着是 ‘:‘ 才能匹配成功,并且结果中不包含 ‘:‘ | 
| (?!p) | 零度负向先行断言,要求接下来的字符不与p匹配 | 
| (?<=p)(提案) | 后行断言,要求前面的字符要与p匹配,并且匹配的结果中不包含p,如 var result = /(?<=\$)\d+/.exec(‘$100*80‘); // result=[‘100‘] | 
| (?<!p) | 后行否定断言,要求前面的字符不能与p匹配,并且匹配结果中不包含p,如 var result= /(?!\$)\d+/.exec(‘$100*80‘);  // result=[‘80‘] | 
正则表达式中的修饰符:
| 字符 | 含义 | 
|---|---|
| i | 忽略大小写 | 
| g | 全局匹配,也就是找到所有的匹配,而不是找到第一个匹配之后就停止 | 
| m | 多行匹配,^匹配每一行的开头,$匹配每一行的结尾 | 
| u(ES6) | 能够处理码点大于 \uFFFF 的Unicode字符,即能够处理4个字节的UTF-16编码 | 
| y(ES6) | “粘连”修饰符,匹配必须从未匹配字符串的第一个位置开始,即暗含头部匹配。下一次的匹配是在lastIndex的位置开始匹配。详细说明见[ES6y修饰符]( <https://blog.csdn.net/qq_43199318/article/details/102489816 )。 | 
| s(提案) | 使 ‘.‘ 修饰符可以匹配任意一个字符 | 
String支持的4中使用正则表达式的方法:
| String方法 | 用法 | 
|---|---|
| search() | 参数:一个正则表达式 ,若不是,会先通过RegExp构造函数将其转换成正则表达式                                                                                                                                                          返回值:第一个与之匹配的子串的起始位置,若匹配失败返回-1                                                 注意:不支持全局搜索,忽略g修饰符                                                                                                示例:‘JavaScript‘.search(/Script/); // 4      | 
| replace() | 参数:第一个是正则表达式,第二个是要进行替换的字符串                                                             返回值:替换后的字符串                                                                                                                            注意:如果第一个参数不是正则表达式,不会进行转换                                                                   示例:‘javascript‘.replace(/\w+/,‘JavaScript‘); // JavaScript  | 
| match() | 参数:一个正则表达式,若不是,会先通过RegExp构造函数将其转换成正则表达式                    返回值:非全局匹配时:一个数组,第一个元素是与正则表达式相匹配的字符串,余下的元素是与圆括号(分组)内的子表达式匹配的字符串   全局匹配时:一个数组,元素由正则表达式相匹配的字符串组成,也就是只有非全局匹配时返回数组的第一个元素                                                                                                                                           注意:非全局匹配时,返回的数组带有两个属性,input:要匹配的字符串  index:匹配成功的子串的起始位置                                                                                                                                      示例:var result = ‘1+2=3‘.match(/\d+/); //result[0]=‘1‘ result.index=0 result.input=‘1+2=3‘                                                                                                                          var result = ‘123‘.match(/(1)/d+/); // result[0]=‘123‘ result[1]=‘1‘result.index=0 result.input=‘123‘                                                                                                                              全局匹配时 :var result = ‘123‘.match(/(1)/d+/g); // result[0]=‘123‘ 没有index,input等属性,也没有result[1]  | 
| split() | 参数:可以是一个字符串也可以是一个正则表达式                                                                          返回值:将一个字符串拆分为一个子串组成的数组                                                                             示例:‘1,   2,     3‘.split(‘,‘); // [‘1‘,   ‘2‘,    ‘3‘]                                                                       ‘1,    2,      3‘.split(/\s*,\s*/); //[‘1‘,‘2‘,‘3‘] | 
RegExp的属性:
| 属性 | 含义 | 
|---|---|
| source | 只读字符串,包含正则表达式文本 | 
| global | 只读布尔值,说明是否带有全局匹配修饰符g | 
| ignoreCase | 只读布尔值,说明是否带有忽略大小写修饰符i | 
| multiline | 只读布尔值,说明是否带有多行匹配修饰符m | 
| lastIndex | 可读写的整数,存储下一下匹配时的起始位置 | 
| sticky(ES6) | 只读布尔值,表示是否设置了y修饰符 | 
| flags(ES6) | 返回正则表达式的修饰符 /abc/ig.flags // ‘gi‘ | 
RegExp的方法:
| 方法 | 用法 | 
|---|---|
| exec() | 参数:一个字符串                                                                                                                                    返回值:无论是否是全局匹配,都返回一个数组,并且第一个元素是与正则表达式相匹配的字符串,余下的元素是与圆括号内的子表达式相匹配的字串                                                                       注意:无论是否是全局匹配返回的数组都带有index和input属性                                                       示例:var result = /(1)\d+/.exec(‘123‘); // result[0]=‘123 result[1]=‘1‘ result.index=0 result.input=‘123‘                                                                                                        var result = /(1)\d+/g.exec(‘123); //result[0]=‘123‘ result[1]=‘1‘ result.index=0 result.input-‘123‘ 全局匹配 | 
| test() | 参数: 一个字符串                                                                                                                                   返回值:如果包含正则表达式的一个匹配结果,返回true,否则返回null                                         示例:/\d+/.test(‘123‘); // true    /\d+/.test(‘abc‘); // null | 
原文:https://www.cnblogs.com/zhangguicheng/p/12725001.html