從零開始學正則

前端開膛手發表於2018-08-07

首先,這篇文章只是我個人的學習筆記,學習素材來源於JS正規表示式完整教程(略長) - 掘金,所以有沒有人看我都不在意,感興趣的朋友可以移步源文章。

下面開始寫我個人的筆記了。

一、字元匹配

1,兩種模糊匹配

1.1 橫向模糊匹配:一個正則可匹配的字串的長度不是固定的,可以是多種情況

var regex = /ab{2,5}c/g;
var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log( string.match(regex) ); // ["abbc", "abbbc", "abbbbc", "abbbbbc"]
複製程式碼

1.2 縱向模糊匹配:一個正則匹配的字串,具體到某一位字元時,它可以不是某個確定的字元,可以有多種可能

var regex = /a[123]b/g;
var string = "a0b a1b a2b a3b a4b";
console.log( string.match(regex) ); // ["a1b", "a2b", "a3b"]
複製程式碼

2,字元組

[abc],表示匹配一個字元,它可以是“a”、“b”、“c”之一

2.1 範圍表示法

比如[123456abcdefGHIJKLM],可以寫成[1-6a-fG-M]

2.2 排除字元組

[^abc],表示是一個除"a"、"b"、"c"之外的任意一個字元。字元組的第一位放"^"(脫字元),表示求反的概念

2.3 常見的簡寫形式

\d 就是[0-9]。表示是一位數字。記憶方式:其英文是digit(數字)。

\D 就是[^0-9]。表示除數字外的任意字元。

\w 就是[0-9a-zA-Z_]。表示數字、大小寫字母和下劃線。記憶方式:w是word的簡寫,也稱單詞字元。

\W 就是[^0-9a-zA-Z_]。非單詞字元。

\s 就是[ \t\v\n\r\f]。表示空白符,包括空格、水平製表符、垂直製表符、換行符、回車符、換頁符。記憶方式:s是space character的首字母。

\S 就是[^ \t\v\n\r\f]。 非空白符。

. 就是[^\n\r\u2028\u2029]。萬用字元,表示幾乎任意字元。換行符、回車符、行分隔符和段分隔符除外。記憶方式:想想省略號...中的每個點,都可以理解成佔位符,表示任何類似的東西。

3, 量詞

3.1 簡寫形式

{m,} 表示至少出現m次。

{m} 等價於{m,m},表示出現m次。

? 等價於{0,1},表示出現或者不出現。記憶方式:問號的意思表示,有嗎?

+ 等價於{1,},表示出現至少一次。記憶方式:加號是追加的意思,得先有一個,然後才考慮追加。

* 等價於{0,},表示出現任意次,有可能不出現。記憶方式:看看天上的星星,可能一顆沒有,可能零散有幾顆,可能數也數不過來。

3.2 貪婪匹配和惰性匹配

var regex = /\d{2,5}/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) ); // ["123", "1234", "12345", "12345"]
複製程式碼


var regex = /\d{2,5}?/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) ); // ["12", "12", "34", "12", "34", "12", "34", "56"]
複製程式碼

其中/\d{2,5}?/表示,雖然2到5次都行,當2個就夠的時候,就不在往下嘗試了。

通過在量詞後面加個問號就能實現惰性匹配,因此所有惰性匹配情形如下:

{m,n}?
{m,}?
??
+?
*?

對惰性匹配的記憶方式是:量詞後面加個問號,問一問你知足了嗎,你很貪婪嗎?

4, 多選分支

var regex = /good|nice/g;
var string = "good idea, nice try.";
console.log( string.match(regex) ); // ["good", "nice"]
複製程式碼

分支結構也是惰性的,即當前面的匹配上了,後面的就不再嘗試了


相關文章