字符性能優化
|
表示在兩個或多個項之間進行選擇,相似或/
開始和結尾\
轉義性能
-
連字符,當且僅當在字符組 []
的內部表示一個範圍,好比[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}
限定符
任何元字符 ^、$、\
定位點和序列|
替換