正則表達式基礎筆記


參考資料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. 首先是一個轉義字符 \(,他能出現 1 次或 0 次(?

  2. 而後是一個 0,後面跟着兩個數字 \d{2}

  3. 而後是 )空格- 中的一個,它出現 1 次或不出現 [) -]?

  4. 最後是 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/;

零寬斷言(zero-length assertions)

使用小括號的時候,還有不少特定用途的語法:

零寬的意思是指該位置是不佔寬度的,也就是隻做斷言判斷,但不匹配實際的內容;
\d(?=\.) 這個正向先行斷言就只匹配點號以前的數字,可是它並不會匹配到這個點號,這個 \d(?=\.) 括號中的匹配內容也就是零寬了。

零寬斷言分爲四種,分別是:
正向先行(Positive Lookahead)
正向回顧(Positive Lookbehind)
負向先行(Negative Lookahead)
負向回顧(Negative Lookbehind)

  • 正向負向 的意思是斷言括號中的內容是匹配仍是不匹配

  • 先行回顧 的意思是實際匹配的內容在斷言內容的前面仍是後面

圖片描述

正向先行(Positive Lookahead)

  • 直接地說「零寬正向先行斷言」所匹配的就是 必須出現的斷言內容的前面的內容

正向回顧(Positive Lookbehind)

  • 理解了前面這個「零寬正向先行斷言」,隨之而來的就比較好理解了。依照這個邏輯,零寬正向回顧斷言所匹配的是必須出現的斷言內容以後的內容,它的語法是:(?<=...) 好比 (?<=\.)\w 所匹配的就是點號以後的 ASCII 字符。

負向先行(Negative Lookahead)

  • 負向與正向意思相反, 正向是斷言內容必須出現,而負向則是斷言內容必須不出現。

負向回顧(Negative Lookbehind)

  • 正負向與先行回顧的概念都已在前面列出, 負向回顧的理解應該就很順了。負向回顧的語法是:(?<!...)。 好比 (?<!Java)Script 該正則只匹配不是 JavaScript 的 Script,它就能正確匹配 ECMAScript 和 Script。

相關文章
相關標籤/搜索