正则表达式

字符性能优化

| 表示在两个或多个项之间进行选择,相似或
/ 开始和结尾
\ 转义性能

- 连字符,当且仅当在字符组 [] 的内部表示一个范围,好比[A-Z]表示范围从AZ;若是须要在字符组里面表示普通字符 - ,放在字符组的开头或结尾便可
. 匹配出换行符 \n 以外的任何单个字符
\d 等价[0-9],匹配09数字
\D 等价[^0-9],与 \d 相反
\w 匹配如下字符:A-Z、a-z、0-9个下划线,等价于 [A-Za-Z0-9]
\W [^A-Za-z0-9]优化

限定符(量词字符)编码

显示限定符位于大括号{}中,并包括指示出现次数上下限的数值; *+? 这三个字符属于单字符限定符:code

{n} 恰好匹配 n 请输入代码次
{n,} 至少匹配 n
{n,m} 匹配至少 n 次,至多 m 次,即匹配 nm
* 等价 {0,}
+ 等价 {1,}
? 等价 {0,1}ip

注意字符串

  • 显示限定符中,逗号和数字之间不能有空格,不然返回nullconsole

  • 贪婪量词 *+JavaScript默认是贪婪匹配,即匹配重复字符是尽量多的匹配ast

  • 惰性(最少重复匹配)量词 :当进行贪婪匹配,只须要在要匹配的字符后面加上一个 ? 便可class

var reg = /a+/;
var reg2 = /a+?/;
var str = 'aaab';
str.match(reg); // ["aaa"]
str.match(reg2); // ["a"]

定位点(锚字符、边界)

^ 匹配开始的位置。将 ^ 用做括号 [] 表达式中的第一个字符,则会对字符集求反
$ 匹配结尾的位置
\b 与一个字边界匹配,好比 er\b 与 "never" 中的 "er" 匹配,但与 "verb" 中的 "er" 不匹配
\B 非边界字匹配

标记

[] 字符组,标记括号表达式的开始和结尾。[...] 匹配括号内任意字符。不少字符在 [] 都会失去原来的意义:[^...] 匹配不在括号内的任意字符;[?.]匹配普通的问号和点号

注意:

\[] 中仍为转义字符。若是要匹配反斜杠字符,使用两个反斜杠 \\
{} 标记限定符表达式的开始和结尾
{} 标记子表达式的开始和结尾,主要做用是分组,对内容进行区分
(模式) 记住和这个模式匹配的匹配项(捕获分组),不要滥用括号,若是不须要保存子表达式,可以使用非捕获型括号 (?:) 来进行性能优化
(?:模式) 与模式匹配,但不保存匹配项(非捕获分组)
(?=模式) 零宽正向先行断言,要求匹配与模式匹配的搜索字符串。找到一个匹配项后,将在匹配文本以前开始搜索下一个匹配项;但不会保存匹配项
(?!模式) 零宽负向先行断言,要求匹配与模式不匹配的搜索字符串。找到一个匹配项后,将在匹配文本以前开始搜索下一个匹配项;但不会保存匹配项
先行断言 ?= 模式:x 只有在 y 前面才匹配,必须写成 /x(?=y)/。解释:找一个 x,那个 x 的后面要有 y
先行否认断言 ?! 模式:x 只有不在 y 前面才匹配,必须写成 /x(?!y)/。解释:找一个 x,那个 x 的后面没有 y

ES7提案

后行断言( ?<= 模式):与”先行断言”相反, x 只有在y后面才匹配,必须写成 /(?<=y)x/。解释:找一个 x,那个 x 的前面要有 y
后行否认断言 ( ?<! 模式): 与”先行否认断言“相反,x 只有不在y后面才匹配,必须写成 /(?<!y)x/。 解释:找一个x ,那个 x 的前面没有 y
反向引用:主要做用是给分组加上标识符 ln n 表示引用字符,与第 ln 个子表达式第一次匹配的字符相匹配

var str = '<div class="o2">' +
    '<div class="o2_team">' +
    '<img src="">' +
    '</div>' +
    '</div> ';
// <(?!img) 表示找一个左尖括号<,并且左尖括号 < 的后面没有img字符;
// (?:.|\r|\n)*? 表示匹配左右尖括号<>里面的.或\r或\n,并且匹配次数为*?;(?:)不保存匹配项,提升性能;
// *后面加个? 表示非贪婪匹配。
var reg = /<(?!img)(?:.|\r|\n)*?>/gi;
str.match(reg);

反向引用的例子,给 MikeMike 字符后加个单引号:

var reg = /(Mike)(\1)(s)/;
var str = "MikeMikes";
console.log(str.replace(reg, "$1$2'$3"));
// 返回结果 MikeMike's

非打印字符

\s 任何空白字符。即 [\f\n\r\t\v]
\S 任何非空白字符
\t Tab 字符 (\u0009)
\n 换行符 (\u000A)
\v 垂直制表符 (\u000B)
\f 换页符 (\u000C)
\r 回车符 (\u000D)

注意

\n\r 一块儿使用,即 /[\r\n]/g 来匹配换行,由于 Unix 扩展的系统以 \n 标志结尾,Windows\r\n 标志结尾

其余

\cx 匹配 x 指示的控制字符,要求 x 的值必须在 A-Za-z 范围内
\xn 匹配 n n 是一个十六进制转义码,两位数长
\un 匹配 n 其中 n 是以四位十六进制数表示的 Unicode 字符
\nm\n 先尝试反向引用,不可则再尝试标识为一个八进制转义码
\nmln 是八进制数字 (0-3)ml 是八进制数字 (0-7) 时,匹配八进制转义码 nml

修饰符

i 执行不区分大小写的匹配
g 执行一个全局匹配,即找到全部的匹配,而不是在找到第一个以后就中止
m 多行匹配模式,^ 匹配一行的开头和字符串的开头,$ 匹配行的结束和字符串的结束
ES6新增 uy 修饰符

u 修饰符 Unicode 模式,用来正确处理大于 \uFFFFUnicode 字符。正确处理四个字节的 UTF-16 编码

// 加u修饰符之后,ES6就会识别\uD83D\uDC2A为一个字符,返回false。
/^\uD83D/u.test('\uD83D\uDC2A');  // false
/^\uD83D/.test('\uD83D\uDC2A'); // true

y 修饰符 与g 修饰符都是全局匹配,不一样之处在于:lastIndex 属性指定每次搜索的开始位置,g 修饰符从这个位置开始向后搜索,直到发现匹配为止;可是 y 修饰符要求必须在 lastIndex 指定的位置发现匹配,即 y 修饰符确保匹配必须从剩余的第一个位置开始

/b/y.exec('aba')  // null
/b/.exec('aba')  // ["b"]

优先级顺序

\ 转义符
(),(?:),(?=),[] 括号和中括号
*、+、?、{n}、{n,}、{n,m} 限定符
任何元字符 ^、$、\ 定位点和序列
| 替换