2008年12月17日

RegExp:特徵與方法

RegExp | 特徵與方法
prototype $1 至 $9 length constructor global ignoreCase
lastIndex multiline source exec test toString
RegExp 的特徵

RegExp 繼承了 Function.prototypeObject.prototype 的特徵與方法;這些可以直接用在 RegExp,如同下面的用法,在此不再敖述。前述繼承的特徵與方法,有些只能用在物件型態,有些只能用在物件實體,有些兩者皆可;使用時要注意。

下述特徵必須與 RegExp 配合使用,不能用在物件實體。

prototype

可以增加物件的特徵與方法。

  • 程式用法:

    <script type='text/javascript'>
    var re=new RegExp("\\s", 'ig');
    RegExp.prototype.dump=function()
      {
        document.write( this.toString() );
      }
    re.dump();
    </script>

  • 執行結果:

    /\s/gi

$1 至 $9

使用存入括號,可將符合的子字串存入陣列中,然後用特徵 $1 ~ $9 讀出。

  • 程式用法:

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

  • 執行結果:

    x@456
    joe 456

length

存有參數的個數。

  • 程式用法:

    <script type='text/javascript'>
    document.write( RegExp.length );
    </script>

  • 執行結果:

    2

  • 此例,Firefox 輸出為 1;IE, Safari, Chrome 為 2。
RegExp 物件實體的特徵
constructor

存有產生物件實體的函式其位置。

  • 程式用法:

    <script type='text/javascript'>
    re=/^[a-zA-Z]+$/gi;
    document.write( re.constructor );
    </script>

  • 執行結果:

    function RegExp() { [native code] }

global

如果字旗 g 有設,則為 true;否則為 false。唯讀。

  • 程式用法:

    <script type='text/javascript'>
    re.global=false;
    document.write( re.global );
    </script>

  • 執行結果:

    true

ignoreCase

如果字旗 i 有設,則為 true;否則為 false。唯讀。

  • 程式用法:

    <script type='text/javascript'>
    re.ignoreCase=false;
    document.write( re.ignoreCase );
    </script>

  • 執行結果:

    true

lastIndex

程式師可設定此特徵,指定符合計算的起始位置。字旗 g 必須有設,才能使用 lastIndex。lastIndex 不可超過字串的長度,否則會導致失敗。符合計算後 lastIndex 會被設為符合子字串的下一個位置。

  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    re=/e(l|n)/ig;
    document.write( s.replace(re, 'x' ) +
        '<br />'+ re.lastIndex +'<br />');
    re.lastIndex=0;
    re.exec( s );
    document.write( re.lastIndex +'<br />');
    re.exec( s );
    document.write( re.lastIndex );
    </script>

  • 執行結果:

    Hxlo Wxdy
    0
    3
    9

  • 上例中的 s.replace(),在 IE 會改變 re.lastIndex,內存 9;Firefox, Safari, Chrome 都是 0。所以在 IE 中,下面要加上 re.lastIndex=0,其後的 re.exec( s ) 才會從頭計算。
multiline

如果字旗 m 有設,則為 true;否則為 false。唯讀。

  • 程式用法:

    <script type='text/javascript'>
    re.multiline=true;
    document.write( re.multiline );
    </script>

  • 執行結果:

    false

source

內存文法規則。唯讀。

  • 程式用法:

    <script type='text/javascript'>
    re=/^[a-zA-Z]+$/gi;
    re.source='';
    document.write( re.source );
    </script>

  • 執行結果:

    ^[a-zA-Z]+$

RegExp 物件實體的方法
exec()

對母字串加以處理,尋找符合文法規則的子字串,結果存入陣列中。其語法是:

result = regexp.exec(母字串);

沒有符合時,傳回 null。符合發生時,產生以下結果:

  1. 結果陣列:[0]存上次符合子字串。[1]...[n]存符合存入括號的子字串。
  2. index:符合發生在母字串的位置。
  3. input:母字串。
  4. lastIndex:符合子字串的下一個位置。如果字旗 g 有設,則可以在同一字串執行多次 exec(),每次執行會由 lastIndex 開始。
  • 程式用法:

    <script type='text/javascript'>
    var s='Hello Wendy';
    var re=/e(l|n)/gi;
    document.write( s.replace(re, 'x' ), '<br />');
    var rs=re.exec( s );
    document.write( rs, '<br />');
    document.write( rs.length +' : '+
        rs.index +' : '+ rs.input +'<br />'); 
    for(var i=0; i < rs.length; i++) 
      document.write( rs[i] +' : ');
    </script>

  • 執行結果:

    Hxlo Wxdy
    el,l
    2 : 1 : Hello Wendy
    el : l :

  • 上例中的 re.exec( s ),IE 沒找到符合的子字串,回傳 null;Firefox, Safari, Chrome 都成功找到符合的子字串。原因請參見 lastIndex
test()

對母字串加以處理,尋找符合文法規則的子字串。其語法是:

regexp.test(母字串);

符合發生時,傳回 true;沒有符合時,傳回 false。

  • 程式用法:

    <script type='text/javascript'>
    s='Hello Wendy';
    re=/e(l|n)/gi;
    document.write( s.replace(re, 'x' ), '<br />');
    document.write( re.test( s ));
    </script>

  • 執行結果:

    Hxlo Wxdy
    true

  • 上例中的 re.test( s ),IE 沒找到符合的子字串,回傳 false;Firefox, Safari, Chrome 都回傳 true。原因請參見 lastIndex
toString()

此法傳回物件實體的字串。

  • 程式用法:

    <script type='text/javascript'>
    document.write( re.toString() );
    </script>

  • 執行結果:

    /e(l|n)/gi


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