Javascript學習筆記(二)Javascript核心之使用Regex的模式比對

來源:互聯網
上載者:User

  Regex定義:
  直接量,var pattern = /s$/;  //與所有以字母"s"結尾的字串匹配
  建構函式,var pattern = new RegExp('s$');

  直接量字元:
    字元 | 匹配
    字母數字字元 | 自身
    \o | NUL字元(\u0000)
    \t | 定位字元(\u0009)
    \n | 分行符號(\u000A)
    \v | 垂直定位字元(\u000B)
    \f | 換頁符(\u000C)
    \r | 斷行符號(\u000D)
    \xnn | 由十六進位數nn指定的拉丁字元,如: \x0A等價於\n
    \uxxxx | 由十六進位數xxxx指定的Unicode字元,如: \u0009等價於\t
    \cx | 控制字元^X。如\cJ等價於分行符號\n 

  字元類:
    字元 | 匹配
    [...] | 位於括弧內的任一字元
    [^...] | 不在括弧內的任一字元
    . | 除分行符號和其他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] | 退格直接量(特例)
  在方括弧內也可以使用這些特殊字元類逸出序列。如/[\s\d]/匹配任意的空白符或數字。

  重複:
    字元 | 含義
    {n,m} | 匹配前一項至少n次,但不超過m次
    {n,} | 匹配前一項n次,或更多次
    {n} | 匹配前一項恰好n次
    ?  | 匹配前一項0次或1次,等價於{0,1}
    +   | 匹配前一項1次或多次,等價於{1,}
    *   | 匹配前一項0次或多次,等價於{0,}
  注意*和?,由於這些字元可能匹配前面字元的0個執行個體,所以它們允許什麼都不匹配,如/a*/可以與"bbbb"匹配,因為它含有0個a。
  重複字元可以匹配儘可能多的字元,而且允許接下來的Regex繼續匹配,可以說重複是“貪婪的”。但我們也可以以非貪婪的方式進行重複,只需要在重複字元後加問好即可。

  選擇、分組和引用:
    字元 | 含義
    |   | 選擇。匹配的是該富豪左邊的子運算式或右邊的子運算式
    (...)   | 組合。將幾個公事包為一個單元,這個單元可以由*、+和?等符號使用,還可以記住和這個組合匹配的字元以供此後的引用使用
    (?:...)   | 只組合。把公事包到一個單元,但不記憶與該組合匹配的字元。
    \n   | 和第n個分組第一次匹配的字元相匹配。組是括弧中的子運算式(可能是嵌套的)。組號是從左至右計數的左括弧數,以(?:形式分組的組不編碼

  Regex的文法還包括指定選擇項、對子運算式分組和引用前一子運算式的特殊字元。
  字元"|"用於分隔供選擇的字元。如:/ab|cd|ef/匹配字串"ab",或"cd",或"ef"。選擇項是從左至右考慮,直到發現匹配項。如果左邊的選擇項匹配,就忽略右邊的匹配項。在應用中要注意把更好的匹配放在正則式的左邊。

  括弧在Regex中的作用有幾種。
  一種是把單獨的公事包成子運算式,以便可以像處理一個獨立的單元那樣用|、*、+或?等來處理它們。如/java(script)?/匹配"java"其後可以有也可以沒有"script";
  另一種是在完整的模式中定義子模式。當一個Regex成功地和目標字串匹配時,可以從目標串中抽出和括弧中的子模式相匹配的部分(之後詳述);
第三種是允許我們在同一Regex後部引用前面的子運算式,這是通過在字元"\"後加一位或多位元字實現的。數字指定了帶括弧的子運算式在正則式中的位
置。如\n引用的是第n個帶括弧的運算式。需要注意的是,由於子運算式可以被嵌套在別的子運算式中,所以它的位置是被計數的左括弧的位置。對Regex中
前一子運算式的引用所指的並不是那個子運算式的模式,而是與那個模式相匹配的文本。如我們在用Regex匹配單引號或雙引號時,可以用\n的方法來進行約
束。
  在JavaScript1.5中,無須建立帶編碼的引用就可以將Regex中的項目進行組合。它是以(?和)來分組。

  指定匹配的位置:
     字元   | 含義
     ^   | 匹配字串的開頭,在多行檢索中,匹配一行的開頭
     $   | 匹配字串的結尾,在多行檢索中,匹配一行的結尾
     \b   | 匹配一個詞語的邊界。也就是位於字元\w和\W之間的位置,或位於    字元\w和字串開頭或結尾之間的位置(注意區分[\b])
     \B   | 匹配非詞語邊界的字元
     (?=)   | 正前向聲明,要求接下來的字元都與模式p匹配,但是不包括匹配中    的那些字元
     (?!p)   | 反前向聲明,要求接下來的字元不與模式p匹配

  標誌:
  Regex的標誌,說明進階模式比對規則。它是在"/"符號之外說明的,位於第二個斜杠之後。
  JavaScript1.2支援兩個標誌,標誌i說明模式比對應該是大小寫不敏感的字元,標誌g說明模式比對應該是全域的,即要找出被檢索字串中所以的匹配。
  JavaScript1.5還支援標誌m,它以多行模式執行模式比對。在這種模式中,如果要檢索的字串中含有分行符號,^和$錨除了匹配字串的開頭和結尾外,還匹配每行的開頭和結尾。

  用於模式比對的String方法
search()方法:該方法以Regex為參數,返回第一個與之匹配的子串的開始字元的位置,如果沒有任何匹配的子串,返回-1。如果參數不是正則表
達式,它首先將被傳遞給RegExp建構函式,轉換成Regex。search()方法不支援全域檢索,因為它忽略了Regex參數的標誌g。

replace()方法:執行檢索和替換操作。它的第一個參數是一個Regex,第二個參數是要進行替換的字串。如果Regex中設定了標誌g,該方
法將用替換字串替換被檢索的字串中所有與模式比對的子串。否則只替換髮現的第一個與模式比對的子串。如果第一個參數是字串,而不是Regex,它將
直接檢索那個字串,而不用RegExp()建構函式將它轉換成Regex。
  replace()方法的更強用法是,由於Regex中用括弧括起來的子運算式是從左至右進行編號的,而且Regex會記住與每個子運算式匹配的文本。如果在替換字串中出現了符號$加數字,那麼replace()將用與指定的子運算式相匹配的文本來替換這兩個字元。
  而且,replace()方法的第二個參數還可以是函數,該函數能夠動態計算替換字串。

match()方法:它的參數是一個Regex(或把它的參數傳遞個RexExp()函數以轉換成Regex),返回包含了匹配結果的數組。如果該正則
運算式有標誌g,該方法返回的數組包含的就是出現在字串中的所有匹配。否則,只檢索第一個匹配。但是,即使match()執行的不是全域檢索,它也返回
一個數組。在這種情況下,數組的第一個元素就是匹配的字串,而餘下的元素則是運算式中用括弧括起來的子運算式。因此,如果match()返回了一個數組
a,那麼a[0]存放的是完整的匹配,a[1]存放的是與第一個括弧括起來的運算式匹配的子串,依次類推。為了和replace()方法保持一致,a
[n]存放的是$n的內容。
  此外,match()方法返回的數組具有length、index和input屬性。其中index包含的是字串中匹配開始處的字元的位置,後者則是目標字串的一個副本。

  split()方法:這個方法可以把調用它的字串分解為一個子串數組,使用的分隔字元是它的參數。如果split()方法使用Regex作為參數,就可以有一個非常強大的分解方式。

  RegExp對象
  建構函式RegExp()有兩個字串參數,其中第二個參數是可選的,它們是"g"、"i"、"m"的組合。第一個參數是包含Regex主體的字串,也就是Regex直接量中出現斜線之間的文本。

RegExp對象定義了兩個用於執行模式比對操作的方法。
exec()方法與String的match()方法相似,它是以字串為參數的RegExp方法。exec()方法對一個指定的字串執行一個正則表
達式,也就是在一個字串中檢索匹配。如果沒有匹配返回null,如果找到匹配返回一個數組。結果與match()方法的非全域檢索返回的數組一樣,而不
管Regex中是否具有全域屬性g。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.