天天看點

從零開始學_JavaScript_系列(16)——js系列<5>(正規表達式)

前注:參考網易雲課堂前端的正規表達式内容

(12)正規表達式

①描述字元串規則的表達式

使用  /規則/  來表示

②正規表達式.test(字元串)

用于測試正規表達式與字元串是否比對

傳回值是true或者false

注:隻需要字元串裡包含正規表達式,即傳回true,也就是說,假如正規表達式是/123/,字元串是a1234b,那麼依然傳回true

③錨點:

^     起始位置(shift+6),/^http:/比對以https開頭的

$     結束為止,/\.jpg$/ 表示以.jpg結尾

\b    單詞邊界,\bTom\b表示Tom需要是一個獨立的單詞

例:

/^123/.test('ab123')     傳回false

/^123/.test('123ab')     傳回true

/\.jpg$/.test("123.jpg") 傳回true

/\bTom\b/.test("nameis Tom Peel")     傳回true

/\bTom\b/.test("nameisTomPeel")     傳回false

/^12$/.test("12")     傳回true(表示12開頭和結尾,1212是false)

/^12$/.test("a12")    傳回false

④字元類:(表示一個字元)

[abc]   表示a或b或c

[a-z]   表示a~z中的一個

[0-9]   表示0~9中的一個

[^0-9]     表示不是0-9(不是數字)

.       表示任意字元(除換行符)(是一個英文句号)

例子:

/./.test("1233")

true(因為有通配符)

/[0-9]/.test("1233")

true(因為有數字)

/[^0-9]/.test("1233")

false(因為沒有非數字的)

/[^0-9]/.test("1233a")

true(因為有了非數字a)

/[^0-9][^0-9]/.test("1233a")

false(因為隻有一個非數字字元)

/^[0-9]/.test("a1233a")

false(因為不是以0-9的某個數字為開頭的)

⑤元字元

\d    表示[0-9]

\D    表示[^\d],即非0-9

\s    空白符

\S    [^\s]非空白符

\w    [A-Za-z0-9_]字母、數字、下劃線

/\d/.test("2");

/\D/.test("2");

false(因為沒有非數字)

/\w/.test("2");

true(因為有字母、數字、下劃線的一個)

/\s/.test("2");

false(因為沒有空白符)

/\s/.test("22");

true(因為有空白符)

/^\s/.test("22")

false(雖然有空白符,但不在開頭)

/\S/.test("22");

true(因為有非空白符2)

/\S/.test("");

false(因為沒有非空白符空格)

⑥量詞

{m,n}   出現m~n次

*     {0,}表示0~無窮次

?     {0,1}出現0次或者1次

+     {1,}表示出現至少1次

/\d+/.test("1");

true(數字至少出現了一次)

/\d+/.test("a");

false(數字一次都沒出現)

/\d{2,}/.test("1");

false(數字至少出現2次但隻有1次)

/\d+:/.test("1");

false(雖然有數字,但是數字後面沒有跟冒号字元

/\d+:/.test("1:");

true(這個1後面有冒号是以是true)

/1\d{1}/.test("1a1");

false(因為第二個字元應該也是一個數字,并且出現一次)

/1\d{2}/.test("12a1");

false(第2個字元開始,2個字元需要是數字,不符合)

⑦正規表達式的兩個模式:

簡述:

貪婪模式:正規表達式在比對成功的前提下,盡可能多的去比對,比對次數少,效率高;

惰性模式:正規表達式在比對成功的前提下,盡可能少的去比對,比對次數多,效率低。

詳述:

1.從文法角度看貪婪與非貪婪

被比對優先量詞修飾的子表達式,使用的是貪婪模式;被忽略優先量詞修飾的子表達式,使用的是非貪婪模式。

比對優先量詞包括:“{m,n}”、“{m,}”、“?”、“*”和“+”。

忽略優先量詞包括:“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。

2.從應用角度看貪婪與非貪婪

貪婪與非貪婪模式影響的是被量詞修飾的子表達式的比對行為,貪婪模式在整個表達式比對成功的前提下,盡可能多的比對;而非貪婪模式在整個表達式比對成功的前提下,盡可能少的比對。非貪婪模式隻被部分NFA引擎所支援。

3.從比對原理角度看貪婪與非貪婪

能達到同樣比對結果的貪婪與非貪婪模式,通常是貪婪模式的比對效率較高。

所有的非貪婪模式,都可以通過修改量詞修飾的子表達式,轉換為貪婪模式。

貪婪模式可以與固化分組結合,提升比對效率,而非貪婪模式卻不可以。

引用:http://blog.csdn.net/lxcnn/article/details/4756030

⑧轉義符:

元字元

轉義後的字元

/

\/

.

\.

?

\?

/^https?:\/\/[a-z]+\.[a-z]+\.[a-z]+/.test("https://www.baidu.com")

true(表示http開頭,然後可能有s,下來是冒号外加2個/,之後至少有一個字母(小寫的),下來有一個英文句号,之後至少有一個字母(小寫的),下來有一個英文句号,然後以至少一個英文字母為結尾)

⑨多選分支

|     表示或

/^(a|b)/.test("a1");

true(表示a或者b開頭的,等價于[ab])

/^(a|b)/.test("c1");

false(因為是c開頭)

/\.(jpg|bmp|png|jpeg|gif)$/.test(".jpg1");

false(因為結尾多了一個1,可以用來比對圖檔的檔案名字尾)

⑩正規表達式的捕獲:

()    儲存比對到的字元串,之後可以用

(?:比對條件)     不儲存比對到的字元串

varp = str.match(regexp)   擷取比對到的字元串,傳回值是p

捕獲到的變量存儲在$1,$2之類的變量中

(https?:)\/\/    表示http,可能有s,後面是一個冒号,再後面跟着//

([^/\]+)   表示不是\的字元,有至少1個

(\/[^/?]*)?   表示先有一個/,然後非?字元有0~多個(并且這一段可能有可能沒有)

(\?[^#]*)?    表示?開頭,然後非#字元有0~多個(并且這一段也可能有可能沒有)

(#.*)?  表示#開頭,任意字元有0~多個。并且這段可能有可能沒有

varstr ="http://www.baidu.com".match(/(https?:)\/\/([w]+)\.([a-z]+)\.([a-z]+)/)

str        這裡是輸出str(即match的傳回值,注意,str是一個字元串數組)

["http://www.baidu.com","http:", "www", "baidu", "com"]

⑪替換一個子串

str.replace(regexp/substr,replacement)   表示字元串用正規表達式比對後,替換為參數2。注意,參數2可以是函數,函數的參數是要被替換的内容

"abc".replace(/(c)/,"$1.00");

"abc.00"(c被比對到了,$1表示捕獲到的c,替換為c.00)

"priceis 5".replace(/(\d)/g,"$$$1.00");

"priceis $5.00"(使用兩個$可以表示一個$)

⑫表示全部

在正規表達式後面加g

/a/g

abca".replace(/(a)/g,"$1.00")

"a.00bca.00"(所有a都被替換為a.00)

繼續閱讀