正規表示式彙總

2022-08-29 17:00:28 字數 3578 閱讀 8510

一直以來,遇到正規表示式的時候,我更多的時候是在網上直接查詢,通俗的說就是吃等食,等著直接吃別人嚼好的饃,最終的結果無疑就是誰嚼了誰才能真正吸收營養,以致於我每次再用到它時原本以為瞭如指掌卻終止於似曾相識。 所以,簡單做下歸納,增加一下理解。

在這裡先貼出一篇參考資料:正規表示式30分鐘入門教程:

一.正規表示式基礎

1.概念:正規表示式描述了一種字串匹配的模式,可以用來檢查乙個串是否有某種子串,並將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。

2.正規表示式全部符號的解釋

3.屬性

(1)global屬性:這個屬性指明在搜尋字串時是全域性匹配還是只匹配第乙個。

(2)ignorecase屬性:指明模式搜尋是否區分大小寫。

4.向後引用

應用正規表示式的時候,如果想在相鄰位置重複某個字元,我們通常使用下面例子這種方法:

var  reg = /\d/;//

重複單個字元

var reg = /(\d[a-z])/;//

重複某個字串

當要匹配的字串不相鄰時,應該用後向引用。

說明:後向引用能夠實現歸功於正規表示式乙個重要的特性,就是將匹配成功的模式的某部分進行儲存,供以後使用。也就是說,正規表示式能夠將子模式(也就是圓括號括起來的部分)儲存到乙個臨時的緩衝區,並為它們從左到右按順序設定編號,這些編號從1開始,2,3,4,,,以此類推。當這些快取區的子模式被後面引用時,就會重複搜尋前面儲存的文字,所以後向引用實際上就是引用匹配的分組。對於有的時候,只想進行分組,而不想引用,則可以用"(?:exp)"的形式,既不匹配文字,也不引用編號。如:

var reg = /(\w)(?:\d+)([a-z])\2/;

var str = "man78abab";

console.log(reg.test(str));//true

console.log(regexp.$2);//ab

上面例子中:上面例子中\2匹配的不是78,而是ab就是因為第二個分組不匹配文字,也不引用編號,所以(\w)對應\1,([a-z])對應\2;

注意1:正則物件中後向引用時只能通過\n這種方式實現,不能通過$n這種方式實現,在js中可以應用regexp.$n這種方式檢視子模組的值,另一種使用$n的方式是:

例子1:

var reg = /(\d+)=(\w+)/;

var str = "777=hate";

console.log(str.replace(reg,'$2=$1'));//

hate=777

例子2:

var str = '2013-6-7';

var re = /(\d+)(-)/g;

str = str.replace(re,function($0,$1,$2));

console.log( str );

其他分組語法:

5.次序、貪婪和懶惰

如果有這樣乙個表示式:a.*b,它將會匹配最長的以a開始,以b結束的字串,如果用它來搜尋aabab的話,它會匹配整個字串aabab,也就是說,預設情況下,正規表示式中包含能接受重複的量詞,它通常會匹配盡可能多的字元,這稱為貪婪匹配。如果想匹配盡可能少的字元,就要進行懶惰匹配,實現的方式,就是在表示次數的字元(如:* + ? )後面加 "?"。

一點說明:

var str = 'goooogle『;

var reg1 = /o+/; //"goooo"

var reg2 = /o+?/; //"go"

改動之後:

var str = 'goooogle『;

var reg1 = /o+gle/; //"oooogle"

var reg2 = /o+?gle/; //"oooogle"

後面的例子中,/o+?gle/沒有匹配到"ogle",是因為正規表示式中總是從左往右進行匹配,不會從右邊獲取子串進行匹配。

雖然上述結果相同,但是匹配的實現過程不同,在reg1中,首先o+會匹配所有的"o",然後接著匹配"gle",從而完成整體匹配。而在reg2中,o+?會先匹配乙個"o",然後gle在字串的第2位到第4位(即原串的"ooo")匹配失敗。進而回溯至o+?去匹配第二個"o",成功後再在第3位到第4位匹配"gle",以此類推……最後匹配到整個字串。

從優先順序來說,從左往右的次序匹配 > 貪婪 / 懶惰匹配。

6.位置指定

接下來的四個用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們用於指定乙個位置,就像\b,^,$那樣,因此它們也被稱為零寬斷言。例如:

(?=exp)也叫零寬先行斷言,它匹配文字中的某些位置,這些位置的後面能匹配給定的字尾exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如果在查詢i'm singing while you're dancing.時,它會匹配sing和danc。

(?<=exp)也叫零寬後行斷言,它匹配文字中的某些位置,這些位置的前面能給定的字首匹配exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查詢reading a book時,它匹配ading。

負向位置指定

零寬負向先行斷言(?!exp),只會匹配字尾exp不存在的位置。\d(?!\d)匹配三位數字,而且這三位數字的後面不能是數字。

同理,我們可以用(?零寬負向後行斷言來查詢字首exp不存在的位置:(?前面不是小寫字母的七位數字(實驗時發現錯誤?注意你的「區分大小寫」先項是否選中)。

7.方法,區別、聯絡、返回值、作用物件

(1).regobj.test(strobj);

用途:用於測試字串引數中是否存在表示式模式,返回值:boolean

(2).regobj.exec(strobj);

用途:方法用於正規表示式模式在字串中執行查詢,如果找到了匹配文字,就返回乙個結果數值,否則,返回null;

(3).strobj.search(regobj);

用途:在字串中搜尋符合正則的內容,搜尋到就返回出現的位置(位置從0開始計算,如果匹配到多個,只會返回第乙個的位置),搜尋失敗返回-1;

(4).strobj.match(regobj);

用途:在字串中搜尋符合規則的內容,搜尋成功就返回內容,當全域性匹配時:格式為陣列,失敗就返回null;不是全域性匹配時,只匹配第乙個就會停止;

(5).strobj.replace(regobj,新的字串/**函式); 說明:第乙個引數指的是每次匹配成功的字元。

用途:查詢符合正則的字串,找到了就替換成對應的字串,然後返回替換後的內容。

正規表示式彙總

1 校驗密碼強度 密碼的強度必須是包含大小寫字母和數字的組合,不能使用特殊字元,長度在8 10之間。d a z a z 2.校驗中文 字串僅能是中文。u4e00 u9fa5 3.由數字 26個英文本母或下劃線組成的字串 w 4.校驗e mail 位址 同密碼一樣,下面是e mail位址合規性的正則檢...

正規表示式彙總

一 校驗數字的表示式 數字 0 9 n位的數字 d 至少n位的數字 d m n位的數字 d 零和非零開頭的數字 0 1 9 0 9 非零開頭的最多帶兩位小數的數字 1 9 0 9 0 9 帶1 2位小數的正數或負數 d d 正數 負數 和小數 d d 有兩位小數的正實數 0 9 0 9 有1 3位小...

正規表示式彙總

驗證數字的正規表示式集 驗證數字 0 9 驗證n位的數字 d 驗證至少n位數字 d 驗證m n位的數字 d 驗證零和非零開頭的數字 0 1 9 0 9 驗證有兩位小數的正實數 0 9 0 9 驗證有1 3位小數的正實數 0 9 0 9 驗證非零的正整數 1 9 0 9 驗證非零的負整數 1 9 0 ...