2008年12月16日

RegExp

RegExp | 特徵與方法

文法規則計算式,用在字串的符合計算,可以作子字串的搜尋,替換。

\ ^ $ * + ? . (x) (?:x) x(?=y)
x(?!y) x|y {n} {n,} {n,m} [xyz] [^xyz] [\b] \b \B
\cX \d \D \f \n \r \s \S \t \v
\w \W \n \0 \xhh \uhhhh
RegExp

產生一個文法規則計算式(Regular Expression)的物件,用作文字模式的演算。文法規則計算式有兩種宣告法:

var regex = new RegExp("文法規則計算式" [, "字旗"]);

var literal = /文法規則計算式/[字旗];

使用 RegExp 物件製造器時,字母 ”\” 必須加上脫離字母,也就是寫成”\\”。

  • 程式用法:

    <script type='text/javascript'>
    var re=new RegExp("\\s", 'ig');
    var rg=/\s/gi;
    document.write( typeof re +' : '+ re +'<br />');
    document.write( typeof rg +' : '+ rg );
    </script>

  • 執行結果:

    object : /\s/gi
    object : /\s/gi

字旗可是下述字母的組合:

  1. g:全字串符合計算。沒設此旗時,只作第一個符合計算。
  2. i:大小寫視為相同。沒設此旗時,大小寫不相同。
  3. m:在多行文字作符合計算。
  • 程式用法:

    <script type='text/javascript'>
    var s='hello Look glove';
    document.write( s.replace("l"   , "." ) +'<br />');
    document.write( s.replace(/l/   , "." ) +'<br />');
    document.write( s.replace(/l/g  , "." ) +'<br />');
    document.write( s.replace(/l/gi , "." ) );
    </script>

  • 執行結果:

    he.lo Look glove
    he.lo Look glove
    he..o Look g.ove
    he..o .ook g.ove

  • replace() 是物件 String 的方法,會將字串中符合第一個參數的子字串,替換成第二個參數的字串。
文法規則計算式的特別字符
\

脫離字母,有兩種用途:(一)一般文字母前面加了 \,表示是特別字。(二)特別字母前面加了 \,則以一般文字母處理。

^

文字行的開始位置。如果設了字旗 m,則每一個斷行,都是一個新的文字行開始位置。

  • 程式用法:

    <pre>
    <script type='text/javascript'>
    var s='Mad Max\nMark Mouse';
    document.write( s.replace(/^M/g, 'S' ) +'<p>');
    document.write( s.replace(/^M/gm, 'S' ) );
    </script>
    </pre>

  • 執行結果:

    Sad Max
    Mark Mouse

    Sad Max Sark Mouse

$

文字行的尾端。如果設了字旗 m,則每一個斷行之前,都是一個文字行尾端。

  • 程式用法:

    <script type='text/javascript'>
    var s='Mad Sam';
    document.write( s.replace(/M$/gi, 'd' ) );
    </script>

  • 執行結果:

    Mad Sad

*

符合發生 0 次或更多次。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/el*/ig, 'x' ) );
    </script>

  • 執行結果:

    Hxo Wxndy

+

符合發生 1 次或更多次。等於 {1,}。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/el+/ig, 'x' ) );
    </script>

  • 執行結果:

    Hxo Wendy

?

符合發生 0 次或 1次。將 ? 接在 *, +, ?, {} 之後,會變成不貪心模式,只求最小符合字串。否則為貪心模式,求最大符合字串。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/el?/ig, 'x' ) +'<br />');
    document.write( s.replace(/el+/ig, 'x' ) +'<br />');
    document.write( s.replace(/el+?/ig, 'x' ) +'<br />');
    document.write( s.replace(/el*/ig, 'x' ) +'<br />');
    document.write( s.replace(/el*?/ig, 'x' ) );
    </script>

  • 執行結果:

    Hxlo Wxndy
    Hxo Wendy
    Hxlo Wendy
    Hxo Wxndy
    Hxllo Wxndy

.

除了 \n \r \u2028 \u2029 的任一字母。[\s\S] 是所有字母的集合,也包括前述換行字碼。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/e./ig, 'x' ) );
    </script>

  • 執行結果:

    Hxlo Wxdy

(x)

此名為存入括號。計算文法規則 x,符合的子字串存入結果陣列,取值可用 [1], ..., [n] 或用物件的特徵 $1, ..., $9。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/(e.).*(d.)/, 'x' ) +'<br />');
    document.write( RegExp.$1 +' '+ RegExp.$2);
    </script>

  • 執行結果:

    Hx
    el dy

(?:x)

計算符合 x,但是不存入結果陣列。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/(?:e.).*(d.)/, 'x' ) +'<br />');
    document.write( RegExp.$1 +' - '+ RegExp.$2);
    </script>

  • 執行結果:

    Hx
    dy -

x(?=y)

x 符合的條件要加上 x 之後必須接 y。雖然 y 是符合條件之一,但是 y 並不會被替換。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/e(?=l)/gi, 'x' ) );
    </script>

  • 執行結果:

    Hxllo Wendy

x(?!y)

x 符合的條件要加上 x 之後不可接 y。雖然 y 是符合條件之一,但是 y 並不會被替換。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/e(?!l)/gi, 'x' ) );
    </script>

  • 執行結果:

    Hello Wxndy

x|y

符合 x 或 y 都可以。不限兩個參數,例如 d|e|f|g...。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/e(?=(l|n))/gi, 'x' ) +'<br />');
    document.write( s.replace(/(he|lo|dy)/gi, '12' ) );
    </script>

  • 執行結果:

    Hxllo Wxndy
    12l12 Wen12

{n}

n 是正整數。符合正好發生 n 次。

  • 程式用法:

    <script type='text/javascript'>
    var s='Helllllo Wendy';
    document.write( s.replace(/el{2}/gi, 'x' ) +'<br />');
    document.write( s.replace(/el{3}/gi, 'x' ) );
    </script>

  • 執行結果:

    Hxlllo Wendy
    Hxllo Wendy

{n,}

n 是正整數。符合發生 n 次或更多次。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello helllllo Wendy';
    document.write( s.replace(/el{2,}/gi, 'x' ) +'<br />');
    document.write( s.replace(/el{3,}/gi, 'x' ) );
    </script>

  • 執行結果:

    Hxo hxo Wendy
    Hello hxo Wendy

{n,m}

n, m 是正整數。符合發生至少 n 次,最多 m 次。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello helllllo Wendy';
    document.write( s.replace(/el{3,4}/gi, 'x' ) );
    </script>

  • 執行結果:

    Hello hxlo Wendy

[xyz]

字母集合。符合其中的字母。可用”-”表連續的字母,例如 [i-n] 等於 [ijklmn]。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/e[ln]/gi, 'x' ) );
    </script>

  • 執行結果:

    Hxlo Wxdy

[^xyz]

不屬於字母集合中的字母。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    document.write( s.replace(/e[^a-l]/gi, 'x' ) );
    </script>

  • 執行結果:

    Hello Wxdy

[\b]

字碼,清除前一字。與下面的不同。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\bo Wendy';
    document.write( s+'<br />'+ 
             s.replace(/[\b]/gi, 'x' ) );
    </script>

  • 執行結果:

    Hello Wendy
    Hellxo Wendy

\b

字的邊界,也就是頭尾兩字母,接著空白字元或標點符號者。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello, Joe Obama';
    document.write( s.replace(/\bo/gi, 'x' ) +'<br />');
    document.write( s.replace(/o\b/gi, 'x' ) +'<br />');
    document.write( s.replace(/(\bo|o\b)/gi, 'x' ) );
    </script>

  • 執行結果:

    Hello, Joe xbama
    Hellx, Joe Obama
    Hellx, Joe xbama

\B

不是字的邊界,也就是不接著空白字元或標點符號者。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello, Joe Obama';
    document.write( s.replace(/\Bo/gi, 'x' ) +'<br />');
    document.write( s.replace(/\Bo\B/gi, 'x' ) );
    </script>

  • 執行結果:

    Hellx, Jxe Obama
    Hello, Jxe Obama

\cX

控制字母,X 由 A 到 Z。

\d

數字,等於 [0-9]。

  • 程式用法:

    <script type='text/javascript'>
    var s='give me 5!';
    document.write( s.replace(/\d/gi, 'x' ) );
    </script>

  • 執行結果:

    give me x!

\D

拉丁字母中的非數字,等於 [^0-9]。

  • 程式用法:

    <script type='text/javascript'>
    var s='give me 5!';
    document.write( s.replace(/\D/gi, 'x' ) );
    </script>

  • 執行結果:

    xxxxxxxx5x

\f

字碼,跳至下一頁。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\fo Wendy';
    document.write( s+'<br />'+ 
             s.replace(/\f/gi, 'x' ) );
    </script>

  • 執行結果:

    Hell o Wendy
    Hellxo Wendy

\n

字碼,跳至新行。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\no Wendy';
    document.write( s+'<br />'+ 
             s.replace(/\n/gi, 'x' ) );
    </script>

  • 執行結果:

    Hell o Wendy
    Hellxo Wendy

\r

字碼,跳至行首。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\ro Wendy';
    document.write( s+'<br />'+ 
             s.replace(/\r/gi, 'x' ) );
    </script>

  • 執行結果:

    Hell o Wendy
    Hellxo Wendy

\s

單一空白字元,包括空白字,TAB,跳頁,跳行,及獨角碼的空白。等於[\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\f\n\ro W end\u3000y';
    document.write( s+'<br />'+ 
             s.replace(/\s/gi, 'x' ) );
    </script>

  • 執行結果:

    Hell o W end y
    HellxxxoxWxendxy

\S

單一非空白字元。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\f\n\ro W end\u3000y';
    document.write( s+'<br />'+ 
             s.replace(/\S/gi, 'x' ) );
    </script>

  • 執行結果:

    Hell o W end y
    xxxx x x xxx x

\t

字碼,tab。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\to Wendy';
    document.write( s+'<br />'+ 
             s.replace(/\t/gi, 'x' ) );
    </script>

  • 執行結果:

    Hell o Wendy
    Hellxo Wendy

\v

字碼,垂直跳行。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\vo Wendy';
    document.write( s+'<br />'+ 
             s.replace(/\v/gi, 'x' ) );
    </script>

  • 執行結果:

    Hell o Wendy
    Hellxo Wendy

\w

英文大小寫字母,數字,底線”_”。等於 [A-Za-z0-9_]。

  • 程式用法:

    <script type='text/javascript'>
    var s='give me 5!';
    document.write( s.replace(/\w/gi, 'x' ) );
    </script>

  • 執行結果:

    xxxx xx x!

\W

字母不屬於英文大小寫字母,數字,底線”_”。等於 [^A-Za-z0-9_]。

  • 程式用法:

    <script type='text/javascript'>
    var s='give me 5!';
    document.write( s.replace(/\W/gi, 'x' ) );
    </script>

  • 執行結果:

    givexmex5x

\n

n 是正整數,表第 n 個存入括號。將前面第 n 個存入陣列中的符合子字串,當作文法規則。

  • 程式用法:

    <script type='text/javascript'>
    var s=":joe  =456   @456";
    document.write( s.replace(/:([a-zA-Z]+)\s+=(\d+)\s+@\2/, 'x' ) +'<br />');
    document.write( RegExp.$1 +' '+ RegExp.$2 +'<p>');
    document.write( s.replace(/:([a-zA-Z]+)\s+=(\d+)\s+@\1/, 'x' ) +'<br />');
    document.write( RegExp.$1 +' '+ RegExp.$2);
    </script>

  • 執行結果:

    x
    joe 456

    :joe =456 @456
    joe 456

\0

空字元。其後不要接數字。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\0o Wendy';
    document.write( s+'<br />'+ 
             s.replace(/\0/gi, 'x' ) );
    </script>

  • 執行結果:

    Hello Wendy
    Hellxo Wendy

\xhh

ASCII 碼,兩位 16 進位數。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\x3do Wendy';
    document.write( s+'<br />'+ 
             s.replace(/\x3d/gi, 'x' ) );
    </script>

  • 執行結果:

    Hell=o Wendy
    Hellxo Wendy

\uhhhh

獨角碼,四位 16 進位數。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hell\u3041o Wendy';
    document.write( s+'<br />'+ 
             s.replace(/\u3041/gi, 'x' ) );
    </script>

  • 執行結果:

    Hellぁo Wendy
    Hellxo Wendy


©2008-2009 by ant2legs, All Rights Reserved. ant2legs 擁有其製作的文章,圖片與程式的著作權,所有權利保留。