JavaScript權威指南(10)——正規表示式的模式匹配

夕陽下的奔跑發表於2019-09-17

正規表示式的定義

  1. 字元直接量var pattern = /s$/
  2. 建構函式RegExp()
  3. ES 5規定同一段程式碼所表示的正規表示式直接量的每次運算返回新物件,ES 3返回同一個物件
  4. 直接量字元

JavaScript權威指南(10)——正規表示式的模式匹配

  1. 字元類

JavaScript權威指南(10)——正規表示式的模式匹配

  1. 重複

JavaScript權威指南(10)——正規表示式的模式匹配

/\d{2,4}/ // Match between two and four digits
/\w{3}\d?/ // Match exactly three word characters and an optional digit
/\s+java\s+/ // Match "java" with one or more spaces before and after
/[^(]*/ // Match zero or more characters that are not open parenthesis
複製程式碼
  1. 非貪婪的重複——在待匹配的字元後跟隨一個問好即可
   使用“aaa”作為匹配字串,/a+/會匹配三個字元
   /a+?/會匹配一個字元
複製程式碼
  1. 選擇、分組和引用
   /ab|cd|ef/可以匹配字串ab,cd,或者ef
   /\d{3}|[a-z]{4}/可以匹配三位數字或四個小寫字母
複製程式碼

圓括號的一個作用是把單獨的項組合成子表示式

   /java(script)?/可以匹配java,其後可以有script或沒有
   /(ab|cd)+|ef/可以匹配ef,也可以匹配ab或cd的一次貨多次重複
複製程式碼

圓括號的另一個作用是在完整的模式中定義字模式

   /[a-z]+(\d+)/可以從匹配中抽取數字
複製程式碼

圓括號的另一個用途是允許在同一正規表示式的後部引用前面的子表示式

   /([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/
   其中的([Ss]cript)可以用\2來指代
複製程式碼
   /['"][^'"]*['"]/不要求左側和右側的引號
   /(['"])[^'"]*\1/匹配左側和右側的引號
複製程式碼

在正規表示式中不用建立帶數字編碼的引用,以(?:和)來進行分組

   /([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/
   \2指代(fun\W*)
複製程式碼

JavaScript權威指南(10)——正規表示式的模式匹配

  1. 指定匹配位置
   /^JavaScript$/匹配單詞JavaScript
   /\sJava\s/匹配前後有空格的單詞Java(如果在開始或結尾,則匹配不成功)
   /\bJava\b/匹配單詞Java,返回值無空白符——\b是單詞的邊界
   \B把匹配的錨點定位在不是單詞的邊界處
   /\B[Ss]cript/與JavaScript和postscript匹配
複製程式碼
   如果在符號(?=和)之間加入一個表示式,就是一個先行斷言,圓括號中的表示式必須正確匹配
   如/[Jj]ava([Ss]cript)?(?=\:)/可以匹配JavaScript:The 中的JavaScript,不能匹配Java in。。
複製程式碼
   (?!的斷言是負向先行斷言,用以指定接下來的字元都不必匹配
   如/Java(?! Script)([A-Z]\w*)/可以匹配Java後跟隨一個大寫字母和任意多個ASCII單詞,Java後面不能跟隨Script
複製程式碼

JavaScript權威指南(10)——正規表示式的模式匹配

  1. 修飾符

    /\bjava\b/i不區分大小寫
    /\bjava\b/gi找到所有的匹配
    複製程式碼

JavaScript權威指南(10)——正規表示式的模式匹配

用於模式匹配的string方法

  1. search(),引數是一個正規表示式,返回第一個與之匹配的字串的起始位置,否則返回-1
   "JavaScipt".search(/script/i)
   search會將引數轉換成正規表示式
   search不支援全域性搜尋
複製程式碼
  1. replace(),第一個引數是正規表示式,第二個引數是要進行替換的字串
   text.replace(/javascript/gi,"JavaScript")
   支援g全域性替換所有匹配的字串
   如果第一個引數是字串,會直接搜尋這個字串,不會轉換成RegExp()
複製程式碼
   正規表示式使用圓括號括起來的子表示式是帶有從左到右的索引編號,如果替換字串中出現了$加數字,那麼會與指定的子表示式相匹配的文字來替換這兩個字元
   
   // 引號開始,引號結束,中間無引號
   var quote = /"([^"]*)"/g;
   // 將字串中的引文引號替換為中文半形引號
   text.replace(quote, '“$1”');
複製程式碼
  1. match(),引數是正規表示式,返回一個由匹配結果組成的陣列,如果設定了g,則返回所有匹配結果
   "1 plus 2 equals 3".match(/\d+/g)  //返回["1","2","3"]
複製程式碼

即使不是全域性檢索,返回也是陣列,此時第一個元素是完整的匹配,其他元素儲存的是使用圓括號括起來的表示式相匹配的子串

   var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
   var text = "Visit my blog at http://www.example.com/~david";
   var result = text.match(url);
   if (result != null) {
       var fullurl = result[0]; // Contains "http://www.example.com/~david"
       var protocol = result[1]; // Contains "http"
       var host = result[2]; // Contains "www.example.com"
       var path = result[3]; // Contains "~david"
   }
複製程式碼
  1. split(),參數列示分隔符
   "123,456,789".split(","); // Returns ["123","456","789"]
複製程式碼

引數也可以是正規表示式

   "1, 2, 3, 4, 5".split(/\s*,\s*/); // Returns ["1","2","3","4","5"]
複製程式碼

RegExp物件

  1. 第一個引數是正規表示式(\需要替換成\\),第二個引數是修飾符g,i,m或它們的組合
   var zipcode = new RegExp("\\d{5}", "g");
複製程式碼
  1. RegExp包含5個屬性

    source——包含正規表示式的文字

    global——是否帶有修飾符g

    ignoreCase——是否帶修飾符i

    multiline——是否帶修飾符m

    lastIndex——如果帶g,這個屬性儲存整個字串中下一次檢索的開始位置

  2. exec(),執行正規表示式進行匹配

    var pattern = /Java/g;
    var text = "JavaScript is more fun than Java!";
    var result;
    while((result = pattern.exec(text)) != null) {
        alert("Matched '" + result[0] + "'" +
        	" at position " + result.index +
        	"; next search begins at " + pattern.lastIndex);
    }
    複製程式碼
  3. test(),檢測字串

   var pattern = /java/i;
   pattern.test("JavaScript"); // Returns true
複製程式碼

相關文章