正則表達式

字符性能優化

| 表示在兩個或多個項之間進行選擇,相似或
/ 開始和結尾
\ 轉義性能

- 連字符,當且僅當在字符組 [] 的內部表示一個範圍,好比[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} 限定符
任何元字符 ^、$、\ 定位點和序列
| 替換

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息