| 元字符 | 对应说明 |
|---|---|
| . | 匹配除换行符之外的任意字符 |
| \w | 匹配字母数字下划线,等同于:[a-zA-Z0-9_] |
| \s | 匹配任意空白符 |
| \d | 匹配数字,等同于[0-9] |
| \b | 匹配单词边界 |
| | | 或匹配,如 /x|y/ 正则可匹配x或y两个字符 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
| 反义字符 | 对应说明 |
|---|---|
| [^x] | 匹配除“x”之外的所有字符,其中“x”可以为任意字符 |
| [^xyz] | 同上,匹配除“x、y、z”之外的任意字符 |
| \W | 匹配除了字母、数字、下划线之外的所有字符,等同于:[^\w] |
| \S | 匹配除空白符之外的任意字符,等同于:[^\s] |
| \B | 匹配不是单词边界的字符,等同于:[^\b] |
| \D | 匹配不是数字的所有字符,等同于:[^\d] |
| 转义字符 | 对应说明 |
|---|---|
| \xnn | 匹配十六进制数 |
| \f | 匹配换页符,等同于:\x0c |
| \n | 匹配换行符,等同于:\x0a |
| \r | 匹配回车符,等同于:\x0d |
| \t | 匹配水平制表符,等同于:\x09 |
| \v | 匹配垂直制表符,等同于:\x0b |
| \unnnn | 匹配Unicode字符,如:\u00A0 |
| 匹配字符 | 对应说明 |
|---|---|
| * | 重复0次或者多次 |
| + | 重复1次或者多次 |
| ? | 重复0次或者1次 |
| {n} | 重复n次 |
| {n,} | 至少重复n次 |
| {m,n} | 重复m到n次(m < n) |
| 分组字符 | 对应说明 |
|---|---|
| (exp) | 捕获型分组,用小圆括号进行分组,如日期中年月日的分组:/(\d{5})-(\d{1,2})-(\d{1,2})/每个分组将产生分组号,从第一个括号开始,可以使用\n的形式在正则中使用分组号,如匹配成对出现的HTML标签,可以写成:/<(\w+)></\1>/ |
| (?:exp) | 非捕获型分组,不产生分组号 |
| exp1(?=exp2) | 不产生分组号,前瞻断言,匹配exp1,但后面必须是exp2如匹配姓zhao,名字叫xianlie的人:/zhao(?=xianlie)/ |
| exp1(?!exp2) | 不产生分组号,后瞻断言,匹配exp1,但后面不能是exp2如匹配姓zhao,但名字不叫xianlie的人:/zhao(?!xianlie)/ |
| 修饰符 | 对应说明 |
|---|---|
| i | ignoreCase的缩写,忽略字符大小写 |
| m | multiline的缩写,更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) |
| g | global的缩写,全局匹配 |
exec方法是使用正则表达式的最强大和最慢的方法。如果匹配成功,它会放回一个数组,数组中下标为0的元素将包含正则表达式regexp匹配的子字符串。下标1的元素为分组1捕获的文本,下标2的元素为分组2捕获的文本,以此类推。如果匹配失败,返回null。
var reg = /hello\s(\w*)/;
reg.exec('hello world'); // ['hello world', 'world'];
reg.exec('hi'); // null
var reg2 = /hello\s(?:\w*)/ // 测试非捕获型分组
reg2.exec('hello world'); // ['hello world']
效率相对regexp.test(string)高,如果该regexp匹配string,返回true,否则返回false。不要对这个方法使用g标识
var reg = /hello\s(\w*)/;
reg.test('hello world'); // true
reg.test('hi'); // false
match方法让字符串和一个正则表达式匹配。如果没有g标识,调用string.match(regexp)的结果和调用regexp.exec(string)结果相同。如果存在g标识,会返回一个包含所有匹配(除捕获分组之外)的数组
var reg = /hello\s(\w*)/;
'hello world'.match(reg); // ['hello world', 'world'];
'hi'.match(reg); // null
var reg2 = /hello\s(\w*)/g;
'hello world'.match(reg2); // ['hello world'],捕获型分组不会出现在结果中
'hello world, hello china'.match(reg2); // ["hello world", "hello china"]
replace方法对string进行查找和替换操作,并返回一个新的字符串。参数searchValue可以是一个字符串或者正则表达式。 如果是一个字符串,只会在第一次出现的地方被替换
'hello'.replace('l', 'y'); // heylo
如果是一个正则表达式并且带有g标识,它会替换所有的匹配。如果没有g标识,仅会替换第一个匹配
'hello'.replace(/l/g, 'y'); // heyyo
replaceValue可以是一个字符串或一个函数。 如果replaceValue是一个字符串,字符$拥有特殊的含义
| 美元符号序列 | 对应说明 |
|---|---|
| $$ | $ |
| $& | 整个匹配文本 |
| $number | 分组捕获的文本 |
| $` | 匹配之前的文本 |
| $' | 匹配之后的文本 |
let oldAreaCode = /\((\d{3})\)/g;
let p = '(555)666-1212'.replace(oldAreaCode, '$1-'); // "555-666-1212"
如果replaceValue是一个函数,那么每遇到一次匹配函数就会被调用一次,该函数返回的字符串会被用作替换文本。函数的第一个参数是整个被匹配的文字,第2个参数是分组1捕获的文本,第3个参数是分组2捕获的文本,以此类推。
'hello'.replace(/l/g, function($0) {
console.log($0); // l
return 'y';
}); // heyyo
如果查找到匹配正则表达式的字符串,它返回第一个匹配的首字符位置,如果没有找到匹配,则返回-1,此方法忽略g标识
'hello'.search(/e|l/); // 1 只返回第一个匹配到的e的位置