JavaScript--正則表達式

1. 正則表達式
 是一個描述字符模式的對象.
 1.建立方式
  1) 正則表達式直接量
   var pattern = /s$/;
  2) RegExp()構造函數
   var pattern = new RegExp("s$");
 2. 直接量字符
  正則表達式中全部字母和數字都是按照字面含義進行匹配的。
     字符   匹配
  -----------------------
  字母和數字  自身
   \t   製表符
   \n   換行符 
   \v   垂直製表符
   \f   換頁符
   \r   回車符
   \xnn  由十六進制數nn指定的拉丁字符  \x0A => \n
   \uxxxx  由十六進制xxxx指定的Unicode字符,例如 \u0009 => \t
   \cX   控制字符 ^X,例如 \cJ 等價於換頁符 \n
 3. 字符類
  將直接量字符單獨放在方括號內就組成了字符類。一個字符類能夠匹配它全部包含的任意字符。
  [...]  方括號內的任意字符
  [^...]  不在方括號內的任意字符
 特殊字符類
  .   除換行符和其餘Unicode行終止符以外的任意字符
  \w   任何ASCII字符,等價於[a-zA-Z0-9]
  \W   任何非ASCII字符組成的,等價於[^a-zA-Z0-9]
  \s   任何Unicode空白符:空格,製表符,回車
  \S   任何非Unicode空白符的字符
  \d   任何ASCII數字,等價於 [0-9]
  \D   任何非ASCII數字以外的任意字符,等價於 [^0-9]
  [\b]  退格直接量(特例)javascript

 4. 重複  必定要用在子表達式以後
  {n,m} 匹配前一項至少n次,可是不超過m次
  {n,} 匹配前一項n次或者更屢次
  {n}  匹配前一項n次
  ?  匹配前一項0次或者1次,等價於{0,1}
  +  匹配前一項1次或者屢次,等價於{1,}
  *  匹配前一項0次或者屢次,等價於{0,}java

  例如:
   /[abc]/  匹配"a" "b" "c"中任意一個字符
   /[^abc]/ 匹配"a" "b" "c"以外的任意一個字符
   /\d{2,4}/ 匹配2~4個數字
   /\w{3}\d?/ 匹配三個字符或和一個可選的數字
   /\s+java\s+/ 匹配先後帶有一個或多個空格的字符串"java"正則表達式

 5. 重複方式
  貪婪重複
   匹配重複字符時是儘量多地匹配
  非貪婪重複 
   在待匹配的字符後跟隨一個問號便可: ?? +? *? {1,5}?
  例如:
   /a+/ 能夠匹配一個或者多個連續的字母a, 當使用"aaa"做爲匹配字符串時正則表達式會匹配它的三個字符
   /a+?/ 能夠匹配一個或者多個連續的字母a, 可是儘量少地匹配。只能匹配第一個a
 6. 選擇
  使用字符 "|" 分割供選擇的字符。選擇項的嘗試匹配次序是從左到右,直到發現了匹配項,若是左邊的選擇項匹配,就忽略右邊的匹配項,即便它產生更好的匹配。/ab|cd|ef/ 能夠匹配 "ab"或者"cd"或者"ef"
 7. 分組
  "()"做用:
  1) 把單獨的項組合成子表達式
   以即可以像處理一個單元那樣用"|""*""+""?"對單元內的項進行處理
   /java(script)?/  能夠匹配字符串java,後面的script能夠有也能夠沒有
   /(ab|cd)+|ef/    能夠匹配"ef",也能夠匹配"ab""cd"一次或者屢次
  2) 在完整的模式中定義子模式
   當一個正則表達式成功地和目標字符串相匹配時,能夠從目標串中抽出和圓括號中的子模式相匹配的部分。
   /[a-z]+\d+/  一個或者多個小寫字母后跟隨一個或者多個數字
   (/[a-z]+(\d+)/) 能夠抽出每一個匹配末尾的數字
  3) 在同一正則表達式後面引用前面的子表達式。
   \1 引用第一個帶圓括號的子表達式
   /([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/    \2 引用 ([Ss]cript)
   對正則表達式中前一個子表達式的引用,並非指對子表達式模式的引用,而是對與那個模式相匹配的文本的引用
    例如:
    /['"][^'"]*['"]/ 匹配單引號或者雙引號內的0個或者多個字符,可是它並不要求左側和右側的引號匹配
    /(['"])[^'"]*\1/ 匹配單引號或者雙引號內的0個或者多個字符,可是它要求左側和右側的引號匹配數組

 8. 指定匹配位置
  ^ 匹配字符串的開頭,在多行檢索中,匹配一行的開頭
  $ 匹配字符串的結尾,在多行檢索中,匹配一行的結尾
  \b 匹配一個單詞的邊界,即位於字符\w和\W之間的位置,或者位於字符\w和字符串的開頭或結尾之間的位置。
  \B 匹配非單詞邊界的位置
  (?=p)  零寬正向先行斷言,要求接下來的字符都與p匹配,但不能包括匹配p的那些字符
  (?!p)  零寬負向先行斷言,要求接下來的字符不與p匹配
 9. 修飾符
  不是出如今兩條斜線之間,而是出如今第二條斜線以後。
  new RegExp("","igm")
   i  說明匹配模式匹配是不區分大小寫
   g  說明模式匹配應該是全局的
   m  用以在多行模式中執行匹配。
    /java$/im 能夠匹配"java",也能夠匹配"java\nis fun"
  
2. Javascript中 String對正則表達式的支持     
 1. search() 
  參數爲一個正則表達式。若是參數不爲正則表達式,則先經過RegExp將其轉換爲構造函數。不支持全局檢索,返回第一個與之匹配的子串的位置,若是找不到匹配的子串,返回-1。
  "JavaScript".search(/script/i); //返回4
 2. replace()
  用以執行檢索和替換操做。第一個參數是正則表達式,第二個參數是要替換的字符串。
  text.replace(/javascript/gi,"JavaScript"); //不區分大小寫將全部javascript轉換爲JavaScript
 3. match()  
  最經常使用的正則表達式方法,參數爲正則表達式。返回由匹配結果組成的數組。
  當正則表達式中沒有g修飾符的時候,就不是全局匹配。這時,數組的第一個元素就爲匹配的字符串,剩餘的元素則是由正則表達式中用圓括號括起來的子表達式。若是該正則表達式設置爲修飾符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.briup.com/~ee";
  var result = text.match(url);
  if(result!=null){
   var fullurl = result[0];
   var protocol = result[1];
   var host = result[2];
   var path = result[3];
  }
 4. split() 方法用於把一個字符串分割成字符串數組。url

    語法:stringObject.split(separator(必需。字符串或正則表達式,從該參數指定的地方分割 stringObject。),howmany(可選))
      返回值爲一個字符串數組    參數能夠爲正則表達式
      "1, 2, 3, 4, 5".split(/\s*,\s*/); //["1","2","3","4","5"] 容許分隔符左右兩邊留有空白code

     "2:3:4:5".split(":") //將返回["2", "3", "4", "5"]
     "|a|b|c".split("|") //將返回["", "a", "b", "c"]對象

     "hello".split("") //可返回 ["h", "e", "l", "l", "o"]blog

     "hello".split("", 3) //返回一部分字符,請使用 howmany 參數 返回 ["h", "e", "l"] ip

3. Javascript中RegExp
 1. 構造函數
  第一個參數包括正則表達式的主體部分,即正則表達式直接量中兩條斜線之間的文本
  第二個參數指定正則表達式的修飾符。只能傳入g ,i,m或者其組合,能夠省略
  var zipcode = new RegExp("/\d{5}","g");
 2. 屬性
  source  包含正則表達式文本
  global  布爾值,代表這個正則表達式是否帶有修飾符g
  ignoreCase 布爾值,代表這個正則表達式是否帶有修飾符i
  multiline 布爾值,代表這個正則表達式是否帶有修飾符m
  lastIndex 若是匹配模式帶有g,這個屬性存儲在整個字符串中下一次檢索的開始位置,這個屬性會被exec(), test()方法調用到
 3.方法
  1) exec() 
   與match相似。參數爲字符串。對一個指定的字符串執行一個正則表達式在一個字符串中執行匹配檢索,若是沒有找到任何匹配,返回null,若是找到了匹配,返回一個數組。這個數組元素中的第一個元素包含與正則表達式相匹配的子字符串,剩餘的元素是圓括號內的子表達式相匹配的子串。當調用的正則表達式對象具備修飾符g時,它將把當前正則表達式對象的lastIndex屬性設置爲緊挨着匹配子串的字符位置,當同一個正則表達式第二次調用exec()時,它將從lastIndex屬性所指的字符處開始檢索。若是沒有匹配到任何結果將lastIndex重置爲0.

   var pattern = /Java/ig;
   var text = "JavaScript is more fun than java_is good";
   var result;
   while((result = pattern.exec(text))!=null){
    console.log(result[0]+" at "+result.index);
   }
  2) test() 
   參數爲字符串。用test()對某個字符串進行檢測,若是包含正則表達式的一個匹配結果,返回true.調用test()和調用exec()行爲等價,test()會從lastIndex指定位置處開始檢索某個字符串,若是它找到了一個匹配結果,當即設置lastIndex爲當前匹配字符串的結束位置。

   var pattern = /Java/ig;   var text = "JavaScript is more fun than java_is good";   var pattern.test(text); //結果 true   與test() exec()不一樣,String方法search() replace() match()並不會用到lastIndex屬性

相關文章
相關標籤/搜索