前注:參考網易雲課堂前端的正規表達式内容
(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)