1. 程式人生 > >js正則表示式深入

js正則表示式深入

正則表示式基礎

2.1 元字元介紹

  • "^":^會匹配行或者字串的起始位置,有時還會匹配整個文件的起始位置。
  • "$":$會匹配行或字串的結尾。
  • "\b":不會消耗任何字元只匹配一個位置,常用於匹配單詞邊界 如:我想從字串中"This is Regex"匹配單獨的單詞 "is" 正則就要寫成:"This is Regex".match(/\bis\b/); "\b" 不會匹配is 兩邊的字元,但它會識別is 兩邊是否為單詞的邊界。
  • "\d":匹配數字。
  • "\w":匹配字母,數字,下劃線。等價於'[A-Za-z0-9_]'。
  • "\s":匹配空格。
  • ".":匹配除了換行符以外的任何字元。
  • "[a-zA-Z]":字元組 匹配包含括號內元素的字元。
  • 幾種反義:改成大寫,意思就與原來的相反。
    如:
    "\W":匹配任何非單詞字元。等價於'[^A-Za-z0-9_]'。
    "[^abc]":匹配除了abc以外的任意字元。

  • 字元轉義:在正則表示式中元字元是有特殊的含義的,當我們要匹配元字元本身時,就需要用到字元轉義,如:/\./.test("."); // true

2.2 量詞

2.2.1 常用量詞

  • "*"(貪婪)重複零次或更多,貪婪量詞會首先匹配整個字串,嘗試匹配時,它會選定儘可能多的內容,如果 失敗則回退一個字元,然後再次嘗試回退的過程就叫做回溯,它會每次回退一個字元,直到找到匹配的內容或者沒有字元可以回退。如:
    "aaaaaa".match(/a*/) // ["aaaaaa"]
  • "?"(懶惰)重複零次或一次,懶惰量詞使用另一種方式匹配,它從目標的起始位置開始嘗試匹配,每次檢查一個字元,並尋找它要匹配的內容,如此迴圈直到字元結尾處。如:"aaaaaa".match(/a?/) // ["a"]
  • "+"(佔有)重複零次或更多次,佔有量詞會覆蓋事個目標字串,然後嘗試尋找匹配內容 ,但它只嘗試一次,不會回溯。如:
    "aaaaaa".match(/a+/) // ["aaaaaa"]
  • "{n}"重複n次;如:
    "aaaaaa".match(/a{3}/) // ["aaa"]
  • "{n,m}"重複n到m次;如:
    "aaaaaa".match(/a{3,4}/) // ["aaaa"]
  • "{n,}" 重複n次或更多次;如:
    "aaaaaa".match(/a{3,}/) // ["aaaaaa"]

2.2.1 懶惰限定符

  • "*?" 重複任意次,但儘可能少重複;如:"aabab".match(/a.*?b/) // ["aab"] 為什麼第一個匹配是aab(第一到第三個字元)而不是ab(第二到第三個字元)?簡單地說,因為正則表示式有另一條規則,比懶惰/貪婪規則的優先順序更高:最先開始的匹配擁有最高的優先權
  • "+?" 重複1次或更多次,但儘可能少重複,與上面一樣,只是至少要重複1次。如:"aabab".match(/a.+?b/) // ["aab"]
  • "??" 重複0次或1次,但儘可能少重複。如:"aabab".match(/a.??b/) // ["aab"]
  • "{n,m}?" 重複n到m次,但儘可能少重複。如:"aaa".match(/a{1,3}?/) // ["a"]
  • "{n,}?" 重複n次以上,但儘可能少重複。如:"aaa".match(/a{1,}?/) // ["a"]

2.2.2 處理選項

  • javascript中正則表示式支援的正則表示式有三個,g、i、m,分別代表全域性匹配、忽略大小寫、多行模式。三種屬性可以自由組合共存。
  • 在預設的模式下,元字元 ^ 和 $ 分別匹配字串的開頭和結尾處,模式 m 改變了這倆元字元的定義,讓他們匹配一行的開頭和結尾。

三、正則進階

3.1 捕獲分組

正則表示式一個最重要的特性就是將匹配成功的模式的某部分進行儲存供以後使用這一能力。對一個正則表示式模式或部分模式兩邊新增圓括號將導致這部分表示式儲存到一個臨時緩衝區中。(可以使用非捕獲元字元 '?:', '?=', 或 '?!' 來忽略對這部分正則表示式的儲存。)

所捕獲的每個子匹配都按照在正則表示式模式中從左至右所遇到的內容儲存。儲存子匹配的緩衝區編號從 1 開始,連續編號直至最大 99 個子表示式。每個緩衝區都可以使用 '\n' 訪問,其中 n 為一個標識特定緩衝區的一位或兩位十進位制數。

後向引用一個最簡單,最有用的應用是提供了確定文字中連續出現兩個相同單詞的位置的能力。

舉個例子:

/(\b[a-zA-Z]+\b)\s+\1\b/.exec(" asd sf  hello hello asd"); //["hello hello", "hello"]

解釋這個例子:

1、(\b[a-zA-Z]+\b) 是一個捕獲分組,它捕獲所有的單詞,

" asd sf  hello hello asd".match(/(\b[a-zA-Z]+\b)/g) // ["asd", "sf", "hello", "hello", "asd"]

注:加上/g這個處理選項是便於我理解,沒有這個選項的時候,只輸出第一個單詞asd。
2、\s加了一個空格限制條件,所以最後一個單詞被排除,

" asd sf  hello hello asd".match(/(\b[a-zA-Z]+\b)\s/g) \\ ["asd ", "sf ", "hello ", "hello "]

3、"\1"後向引用,

" asd sf  hello hello asd".match(/(\b[a-zA-Z]+\b)\s+\1\b/g) \\ ["hello hello"]

說實話,這個例子花了我很長時間去理解,有一點點想通,感覺這個概念看起來容易,寫起來並不容易啊。

3.2 捕獲分組常有的用法(斷言)

  • "(exp)" 匹配exp,並捕獲文字到自動命名的組裡;如:
/(hello)\sworld/.exec("asdadasd hello world asdasd") // ["hello world", "hello"]
  • "(?:exp)" 匹配exp,不捕獲匹配的文字,也不給此分組分配組號;如:
/(?:hello)\sworld/.exec("asdadasd hello world asdasd")  // ["hello world"]
  • "(?=exp)" 用來捕獲exp前面的字元,分組中的內容不會被捕獲,也不分配組號;如:
/hello\s(?=world)/.exec("asdadasd hello world asdasd")  // ["hello "]
  • "(?!exp)" 捕獲後面不是exp的字元,同樣不捕獲分組的內容,也不分配組號;如:
/hello\s(?!world)/.exec("asdadasd hello world asdasd") //null
 world改變一下:
/hello\s(?!world)/.exec("asdadasd hello wosrlds asdasd") //["hello "]
  • "(?<!exp)" 匹配前面不是exp的位置;如:
/(?!<\d)123/.exec("abc123 ") // ["123"]

四、Javascript中正則表示式的使用

在JavaScript中定義一個正則表示式語法為:

var reg=/hello/    或者  var reg=new RegExp("hello")

接著列舉一下JavaScript中可以使用正則表示式的函式,並簡單介紹一下這些函式的作用。

4.1 String.prototype.search方法

用來找出原字串中某個子字串首次出現的索引index,沒有則返回-1。可以在官方文件中瞭解更多。

"abchello".search(/hello/);  //  3

4.2 String.prototype.replace方法

用來替換字串中的子串。簡單例子:

"abchello".replace(/hello/,"hi");   //  "abchi"

官方文件中有提到:

如果第一個引數是 RegExp物件,那麼替換字串可以插入特殊變數名$n,n是個小於100的非負整數,表示插入第 n 個括號匹配的字串。

所以我在文中一開始提到的需求就可以用
str.replace(/<span>(.*?)<\/span>/g, '<img src="$1"/>') [$1表示/(.?)<\/span>/g中的“(.?)”)匹配的字串]
答案來解答。

4.3 String.prototype.split方法

用來分割字串

"abchelloasdasdhelloasd".split(/hello/);  //["abc", "asdasd", "asd"]

4.4 String.prototype.match方法

用來捕獲字串中的子字串到一個數組中。預設情況下只捕獲一個結果到陣列中,正則表示式有”全域性捕獲“的屬性時(定義正則表示式的時候新增引數g),會捕獲所有結果到陣列中。

"abchelloasdasdhelloasd".match(/hello/);  //["hello"]
"abchelloasdasdhelloasd".match(/hello/g);  //["hello","hello"]

4.5 RegExp.prototype.exec方法

和字串的match方法類似,這個方法也是從字串中捕獲滿足條件的字串到陣列中,但是也有兩個區別。
1、exec方法一次只能捕獲一份子字串到陣列中,無論正則表示式是否有全域性屬性

/hello/g.exec("abchelloasdasdhelloasd"); // ["hello"]

2、正則表示式物件(也就是JavaScript中的RegExp物件)有一個lastIndex屬性,用來表示下一次從哪個位置開始捕獲,每一次執行exec方法後,lastIndex就會往後推,直到找不到匹配的字元返回null,然後又從頭開始捕獲。 這個屬性可以用來遍歷捕獲字串中的子串。

var reg=/hello/g;
reg.lastIndex; //0
reg.exec("abchelloasdasdhelloasd"); // ["hello"]
reg.lastIndex; //8
reg.exec("abchelloasdasdhelloasd"); // ["hello"]
reg.lastIndex; //19
reg.exec("abchelloasdasdhelloasd"); // null
reg.lastIndex; //0

4.6 RegExp.prototype.test方法

用來測試字串中是否含有子字串

/hello/.test("abchello");  // true

相關推薦

js表示式深入

正則表示式基礎 2.1 元字元介紹 "^":^會匹配行或者字串的起始位置,有時還會匹配整個文件的起始位置。"$":$會匹配行或字串的結尾。"\b":不會消耗任何字元只匹配一個位置,常用於匹配單詞邊界 如:我想從字串中"This is Regex"匹配單獨的單詞 "is"

深入理解-Js表示式-1

正則表示式主要通過模式來匹配、查詢字串。 特殊: 非貪婪模式 var reg = /a+?b/ var str = "aaaab"; var p = reg.exec(str); console.dir(p[0]); //aaaab 貪婪模式 var reg = /

js表示式語法

正則表示式規則 普通字元 字母、數字、漢字、下劃線、以及後邊章節中沒有特殊定義的標點符號,都是”普通字元”。表示式中的普通字元,在匹配一個字串的時候,匹配與之相同的一個字元。 舉例1:表示式 “c”,在匹配字串 “abcde” 時,匹配結果是:成功;匹配到的內容是:”c”;匹配到

表單驗證JS表示式

在表單驗證中,使用正則表示式來驗證正確與否是一個很頻繁的操作,本文收集整理了15個常用的JavaScript正則表示式,其中包括使用者名稱、密碼強度、整數、數字、電子郵件地址(Email)、手機號碼、身份證號、URL地址、 IPv4地址、 十六進位制顏色、 日期、 QQ號碼、 微訊號、車牌號、中文正則。 1

js表示式中關於零寬斷言的奇異現象

碰到一個特別的需求,就是有一段Sql Server 的 SQL片段,內容大概就是所有JOIN表的集合,要求把這個SQL片段分割成陣列,每個元素就是包含單個表的字串。 例如: SQL = INNER JOIN Sale b ON 1=1 LEFT JOIN OutStock c

js表示式驗證字串只包括大小寫字母下劃線和-

背景說明 在之前的開發過程中為了校驗一個欄位只含有大小寫字母,下劃線和-花費了不少力氣才搞定,想著趕快寫一篇部落格來記錄下來,日後開發一定會遇到!! 程式碼實現 首先定義一個變數用來存放驗證字串的正則表示式:var regex=/^[A-Za-z0-9_\-]+$/ig;

JS表示式:量詞的貪婪模式與惰性模式的區別

在說明貪婪模式與惰性模式區別之前,說明一下JS正則基礎: 1.寫法法基礎: regexObj.test(str);例如/123/.test(‘123’); 2.基本語法 錨點:匹配一個位置 ^表示起始位置;/^a/.test(‘str’);表示是否以a開頭

js表示式擷取兩個字串中間的字串

一個最常用的場景 擷取兩個字串中間的字串   var str = "iid0000ffr";     var substr2 = str.match(/id(\S*)ff/);     alert(substr2); 你會發現逗號後面是你要的

js表示式(2)

找到以某個字串開頭的字串 var myReg=/^(abc)/gim; 如果不加m,那麼只找一行,而加了m可以找到每行中以該字串開頭的匹配文字。 如: abcsfsdfasd7890hklfahskfkaluiop7890-7890782ksdlafkasdnfklsdnf;lsabc

js表示式替換(web作業)

運用正則表示式匹配“Paul;Puala,Pauline,paul,Paul”中的所以Paul,並將其替換成Ringo 程式碼如下: <!DOCTYPE html> <html> <head> <title>替換&

js表示式菜鳥例項基礎

正則表示式表單驗證例項: /是否帶有小數/ function isDecimal(strValue ) { var objRegExp= /^\d+.\d+$/; return objRegExp.test(strValue); } /*校驗是否中文名稱組成 */ function is

JS表示式之--?:

使用形如(?:pattern)的正則就可以避免儲存括號內的匹配結果。 ?:匹配冒號後的內容但是不獲取匹配結果;不進行儲存供以後使用  下面這個正則是為了實現只匹配以b或者c開頭的字串,一直匹配到換行字元,但是。可以使用“\1”來反向引用這個括號裡的子 正則表示式所匹配的內容。而且exec方法也會

js表示式之match函式

功能:使用正則表示式模式對字串執行查詢,並將包含查詢的結果作為陣列返回  函式格式:stringObj.match(rgExp) stringObj為字串必選 rgExp為正則表示式必選項  返回值:如果能匹配則返回結果陣列,如果不能匹配返回null  使用方法:&nb

Js 表示式驗證

手機號碼驗證 130,131,132,133,134,135,136,137,138,139,147,150,151,152,153,155,156,157,158,159,177,173180,181,182,185,186,187,188,189 function ch

常用js表示式大全

常用js正則表示式大全  一、校驗數字的js正則表示式  1 數字:^[0-9]*$ 2 n位的數字:^\d{n}$ 3 至少n位的數字:^\d{n,}$ 4 m-n位的數字:^\d{m,n}$ 5 零和非零開頭的數字:^(0|[1-9][0-9

js表示式驗證價格

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <me

值得收藏的八個常用的js表示式

 開發中如果有input輸入框,難免就要寫正則表示式,因此在這裡總結了一些常見常用的正則表示式的書寫方法,希望會大家有所幫助; 附圖:   一.手機號碼 $(document).ready(function(){ //判斷輸入手機號碼是否正確

js 表示式 整合

url的正則表示式:包括IP,域名(domain),ftp,二級域名,域名中的檔案,域名加上埠!使用者名稱等等資訊 function IsURL(str_url) { var strRegex = "^((https|http|ftp|rtsp|mms)?://)" +

js 表示式校驗折扣 1.1~9.9

一   前提     這是今天開發遇到的一個小問題,自己本身是沒有學過正則的,所以只有去百度上找,發現大部分都不是我想要的,所以只有看正則表示式的語法了。 二   結論   最後得出的結論是   --------------

js表示式匹配並替換特定字串

var reg=/name="(.*?)\"/gi; // var arr=str.match(reg); // console.log(arr.length) var newStr=str.replace(reg,'name=