1. 程式人生 > >JavaScript正則表示式(基礎、分組、懶惰匹配、反向引用和零寬斷言)

JavaScript正則表示式(基礎、分組、懶惰匹配、反向引用和零寬斷言)

基礎

常用字元總結:

^ 匹配行的開始位置
$ 匹配行的結束位置
\b 匹配單詞的開始或結束位置
. 匹配除換行符之外的任意字元
\w 匹配單詞字元(包括字母、數字、下劃線和漢字)
\W 匹配非單詞字元
\s 匹配任意的空白字元(空格、製表符、換行符、中文全形空格)
\S 匹配任意的非空白字元
\d 匹配任意的數字
\D 匹配任意的非數字字元

基本的匹配

基本的匹配:
一些基本的匹配由 []與一些字元表示

[]:用來定義匹配的字元範圍
例如[ab]c可以匹配出ac,bc
[1234567890]可以匹配出1個個位數
使用連結符可以來定義字元的範圍
[0-9] [a-z] [A-Z]分別代表數字、小寫字母、大寫字母

^:若^是字元裡的第一個字元,可以匹配除了^後面字元的其它字元
例如:對於ab ac abc adc a[^b]可匹配出ac、ad
[^0-9A-Za-z_]相當於\W

: 用來做轉義
例如.匹配的是除換行度之外的任意字元
所以要匹配真正的. 需要. 。
匹配數字的正則表示式:/^-?[0-9]+(.[0-9]+)?$/,若我們要匹配出數字中的小數點,則必須使用\來做轉義。

限定符:
{n}重複n次
{n,}重複至少n次
{n,m}重複至少n次,最多m次
* 重複至少n次
+ 重複至少1次
? 重複0次或1次

進階

懶惰匹配

*? 儘可能少地使用重複第一次匹配
+? 儘可能少地使用重複,但至少使用一次
?? 使用零次重複(如有可能)或一次重複
{n}? 等同於{n}
{n,}? 儘可能少使用重複單至少使用n次
{n,m}?介於n次和m次之間,儘可能少使用重複

在基礎裡面,用到了一些基礎的限定符,例如*、+,但有時候這些限定符不能滿足我們的要求,覺得單純使用*、+匹配的內容有點多,也就是所謂的貪婪匹配。

以一個例子來做貪婪匹配和懶惰匹配的對比:
var string = “aaabab”;

(string).match(/a.*b/g);(為貪婪匹配)
result:[“aaabab”] 對於正則表示式中的b,它匹配的是最後一個b

(string).match(/a.*?b/g);(為懶惰匹配)
result:[“aaab”,”ab”];

(string).match(/a.+b/g); (為貪婪匹配)
result:[“aaabab”]; 對於正則表示式中的b,它匹配的是最後一個b

(string).match(/a.+?b/g); (為懶惰匹配)
result:[“aaab”] 因為至少使用一次匹配,所有ab不會被匹配出來

(string).match(/a.??b/g)(為懶惰匹配)
result:[“aab”,”ab”];

(string).match(/a.?b/)(為貪婪匹配)
result:[“aab”,”ab”];

分組

分組又稱子表示式,即把一個正則表示式的全部或部分分成一個組
(“102.103.104.111”).match(/(\d{1,3}.){3}\d{1,3}/);
result:[“102.103.104.111”,”104.”];
“104.”就是分組()中所匹配的,還可以通過RegExp.$1獲得

(“102.103.104.111”).match(/(\d{1,3}.){1}(\d{1,3}.){1}(\d{1,3}.){1}\d{1,3}/);
result:[“102.103.104.111”,”102.”,”103.”,”104.”];
102. 103. 104.分別可以通過RegExp.1RegExp.2 RegExp.$3獲得

分組的一個很大的作用可以從結果中截取出我們真正想要的欄位。
文章最後擷取html img標籤中的src屬性的例子中,我們將用到。

反向引用

有了分組的概念後,可以使用反向引用
可以在正則表示式中引用\1 \2 \3… 來代替前一個分組
(“102.102.104.111”).match(/(\d{1,3}.){1}\1(\d{1,3}.){1}\d{1,3}/g);
result:[“102.102.104.111”]
\1代表的是”102.”,並不指的是表示式的內容
(“102.103.104.111”).match(/(\d{1,3}.){1}\1(\d{1,3}.){1}\d{1,3}/g);
result:null
\1是匹配不出103.的

零寬斷言

有時候,我們需要靠某些字串來輔助我們來匹配到我們想要的字串,但是卻不想讓它出現在我們的匹配結果中。

看零寬度之前,先看幾個常用的分組說明
(?:experssion)匹配字串experssion,不儲存匹配的文字,也不給此組分配組號
(?=experssion)匹配字串experssion前面的位置
(?!experssion)匹配後面不是字串experssion的位置
(?<=experssion)匹配字串experssion後面的位置
(?

練習

練習提取一下一個html中img標籤中的src屬性
提取的格式應該為
src=””
src=””
src=””
正則表達ss式為:
var Reg = /<img[^>](src=.*?)[\s|^>]+.*?[>]{1}/g
首先我們用img[^>]和[>]來匹配img標籤。
這裡用到了兩次懶惰匹配,這裡兩次用到了懶惰匹配,src=.*? src遇見空格,src的匹配就結束了,而貪婪匹配會匹配到後面的空格,當然,我們也可以把src=.*?替換為src=[^\s]*來滿足我們的需求。
因為我們只需要src=”“,所以靠分組來拿到我們需要的src=”“

var Reg = /<img[^>](src=.*?)[\s|^>]+.*?[>]{1}/g
var html = document.getElementsByTagName("body")[0].innerHTML;
var result = “”;
while((result = Reg.exec(html)) != null){console.log(result[1])};

result數組裡有兩個成員,第一個是通過正則表示式匹配出的結果,包括<img>的,也就是無視分組的,而第二個是分組的內容,括號內正則匹配出的內容,也就是我們需要的src=