字符性能优化
|
表示在两个或多个项之间进行选择,相似或/
开始和结尾\
转义性能
-
连字符,当且仅当在字符组 []
的内部表示一个范围,好比[A-Z]
表示范围从A
到Z
;若是须要在字符组里面表示普通字符 -
,放在字符组的开头或结尾便可.
匹配出换行符 \n
以外的任何单个字符\d
等价[0-9]
,匹配0
到9
数字\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
次,即匹配 n
到 m
次*
等价 {0,}
+
等价 {1,}
?
等价 {0,1}
ip
注意:字符串
显示限定符中,逗号和数字之间不能有空格,不然返回null
console
贪婪量词 *
和 +
: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-Z
或 a-z
范围内\xn
匹配 n n
是一个十六进制转义码,两位数长\un
匹配 n
其中 n
是以四位十六进制数表示的 Unicode
字符\nm
或 \n
先尝试反向引用,不可则再尝试标识为一个八进制转义码\nml
当 n
是八进制数字 (0-3)
,m
和 l
是八进制数字 (0-7)
时,匹配八进制转义码 nml
修饰符
i
执行不区分大小写的匹配g
执行一个全局匹配,即找到全部的匹配,而不是在找到第一个以后就中止m
多行匹配模式,^
匹配一行的开头和字符串的开头,$
匹配行的结束和字符串的结束ES6
新增 u
和 y
修饰符
u
修饰符 Unicode
模式,用来正确处理大于 \uFFFF
的 Unicode
字符。正确处理四个字节的 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}
限定符
任何元字符 ^、$、\
定位点和序列|
替换