參考資料html
慕課網-鬼斧神工之正則表達式
正則表達式後向引用詳解
正則表達式30分鐘入門教程正則表達式
正則表達式是字符串的搜索和匹配的工具。工具
一個測試正則表達式的工具 regexpal -- 中文版測試
//
表示一個正則表達式的開始和結束網站
/0-9/
界定符就是包含正則表達式在中間的兩個斜槓spa
標點.net
英文字母數字code
漢字、日文、阿拉伯文等語言文字regexp
數理化公式符號htm
其餘可見字符
換行符 \n
回車 \r
製表符 \t
空格
其餘不可見的符號
若是想查找元字符自己的話,就要使用 \
來取消這些字符的特殊意義
例如:\.
\*
\\
代碼 / 語法 | 說明 |
---|---|
| |
匹配兩個或多個分支選擇 |
[] |
匹配方括號中的任意一個原子 |
[^] |
匹配除了方括號中的原子以外的任意字符 |
代碼 / 語法 | 說明 |
---|---|
. |
匹配除換行符之外的任何字符 [^\n] |
\d |
匹配數字 [0-9] |
\D |
匹配非數字 [^0-9] |
\s |
匹配一個不可見原子 [\f\n\r\t\v] |
\S |
匹配一個可見原子 [^f\n\r\t\v] |
\w |
匹配字母或數字或下劃線 [0-9a-zA-Z_] |
\W |
匹配非字母或數字或下劃線 [^0-9a-zA-Z_] |
// 匹配一個或者更多連續的數字 var pattern = /\d+/; /* * 好比一個網站要求你填寫的 QQ 號必須是 5-12 位的數字時,可使用 ^\d{5,12}$ * {5,12} 表示重複次數很多於 5 次,不能多於 12 次,不然都不匹配 * 有些正則表達式處理工具還有一個處理多行的選項,若是選中了這個選項 * ^ 和 $ 的意義就變成了匹配行的開始處和結束處 */
限定符 -- 指定數量的代碼
代碼 / 語法 | 說明 |
---|---|
* |
重複 0 次或更屢次 |
+ |
重複一次或更屢次 |
? |
重複 0 次或 1 次 |
{n} |
剛好重複 n 次 |
{n, } |
最少重複 n 次 |
{n, m} |
重複 n 次到 m 次 |
// 匹配恰好 6 個字符的單詞 var pattern = /\bw{6}\b/;
代碼 / 語法 | 說明 |
---|---|
^ |
匹配字符串開始的位置 |
$ |
匹配字符串結尾的位置 |
\b |
匹配單詞的開始或結束 |
\B |
匹配非單詞的開始或結束 |
// 匹配以字母 a 開頭的單詞 var pattern = /\ba\w*\b/; /* * 先是某個單詞的開頭處 \b * 而後是字母 a * 而後是任意數量的字母或數字 \w* * 最後是單詞的結束處 \b */
代碼 / 語法 | 說明 |
---|---|
() |
匹配其中的總體做爲原子 |
重複單個字符,直接在字符後面加上限定符就好了;
若是想要重複多個字符,能夠用小括號來指定 子表達式(也叫 分組),而後能夠指定這個 分組的重複次數,也能夠對這個 分組進行其餘的一些操做。
// 這個表達式能夠匹配幾種格式的電話號碼,像 `(010)88886666`,或 `022-22334455`,或 `02912345678` 等 var pattern = /\(?0\d{2}[) -]?\d{8}/;
首先是一個轉義字符 \(
,他能出現 1 次或 0 次(?
)
而後是一個 0
,後面跟着兩個數字 \d{2}
,
而後是 )
或 空格
或 -
中的一個,它出現 1 次或不出現 [) -]?
最後是 8 個數字 \d{8}
修正模式能夠理解成是給正則表達式的匹配過程指定一種模式。
匹配結果怎麼會有歧義呢?看看下面的代碼就知道了:
var pattern = /mertens.+1994/; var str = 'mertens__199419941994199419941994';
上面那段代碼就是有歧義的了,看上去能夠是匹配到 mertens__199419941994199419941994
,也可能匹配到 mertens__1994
。
貪婪:匹配結果存在歧義的時候取其長
懶惰:匹配結果存在歧義的時候取其短
未經修飾的量詞就是貪心量詞,末尾加上?
則使量詞變懶惰。
// 貪婪模式 var pattern1 = /mertens.+1994/; var str = 'mertens__199419941994199419941994'; var result1 = str.match(pattern1); console.log(result1); // mertens__199419941994199419941994 // 懶惰模式 var pattern2 = /mertens.+?1994/; var str = 'mertens__199419941994199419941994'; var result2 = str.match(pattern2); console.log(result2); // mertens__1994
分組捕獲的內容能夠在表達式或其餘程序中做進一步的處理。
默認狀況下,每一個分組會自動擁有一個組號
。
分配組號的規則是:從左向右,以分組的左括號爲標誌,第一個出現的分組的組號爲 1,第二個爲 2,以此類推。
後向引用
用於重複搜索前面某個分組匹配的文本。
// \1 表示分組 1 匹配的某個文本 // 匹配連着的兩個重複的單詞 var pattern = /\b(w+)\b\s+\1\b/;
能夠 指定子表達式的組名
// 能夠指定組名爲 Word // 使用這樣的語法:(?<Word>\w+) // 把尖括號換成'也行:(?'Word'\w+)) // 這樣就把\w+的組名指定爲 Word 了 // 要反向引用這個分組捕獲的內容,可使用 \k<Word> var pattern = /(?<Word>\w+) (?'Wrod'\w+)/; // 上一個例子也能夠寫成這樣 var pattern = /\b(?<Word>\w+)\b\s+\k<Word>\b/;
使用小括號的時候,還有不少特定用途的語法:
零寬的意思是指該位置是不佔寬度的,也就是隻做斷言判斷,但不匹配實際的內容;
\d(?=\.)
這個正向先行斷言就只匹配點號以前的數字
,可是它並不會匹配到這個點號
,這個\d(?=\.)
括號中的匹配內容也就是零寬了。零寬斷言分爲四種,分別是:
正向先行(Positive Lookahead
)
正向回顧(Positive Lookbehind
)
負向先行(Negative Lookahead
)
負向回顧(Negative Lookbehind
)
正向
和 負向
的意思是斷言括號中的內容是匹配仍是不匹配
先行
與 回顧
的意思是實際匹配的內容在斷言內容的前面仍是後面
直接地說「零寬正向先行斷言」所匹配的就是 必須出現的斷言內容的前面的內容
理解了前面這個「零寬正向先行斷言」,隨之而來的就比較好理解了。依照這個邏輯,零寬正向回顧斷言所匹配的是必須出現的斷言內容以後的內容,它的語法是:(?<=...)
好比 (?<=\.)\w
所匹配的就是點號以後的 ASCII
字符。
負向與正向意思相反, 正向是斷言內容必須出現,而負向則是斷言內容必須不出現。
正負向與先行回顧的概念都已在前面列出, 負向回顧的理解應該就很順了。負向回顧的語法是:(?<!...)
。 好比 (?<!Java)Script
該正則只匹配不是 JavaScript 的 Script,它就能正確匹配 ECMAScript 和 Script。