JSにおけるexec,match,replace,testメソッドの比較


正規表現の様々な方法の使い方と比較(詳細は参照)
RegExpのexecメソッドのまとめ:
(1)0番目の要素が式に一致するテキスト
(2)1番目の要素はサブエクスプレッションに一致するテキストであり,グループをキャプチャする.
(3)戻り値が配列であることは明らかである.
(4)戻り配列にはlength,index(テキストの最初の文字位置に一致)、input(文字列全体)属性がある
                              var rts = /([?&])_=[^&]*/;
				var cacheURL="http://localhost:8080/qinl/xx.action?_=me";
				var result=rts.exec(cacheURL);
				console.log(result);
この図では、返される要素の個数が2であると同時に、index属性が一致を開始する下付き文字を表し、inputは正規表現を入力する文字列を表すことがわかります.
(5)非グローバルな正規実行execとmatchメソッドは完全に一致する!
                              var rts = /([?&])_=[^&]*/;
				var cacheURL="http://localhost:8080/qinl/xx.action?_=me";
				var result=rts.exec(cacheURL);
				console.log(result);//  
				var result1=cacheURL.match(rts);
				console.log(result1);//  
この図では、非グローバルな正規表現execとmatchの結果が同じであることがわかります.
(6)グローバル正則がexecを実行するとlastIndex属性が次の検索下付きを表し、execが一致するテキストが見つからない場合nullを返し、lastIndexを0にリセットする
Stringオブジェクトのtestメソッド:
(1)正規表現の字面量とRegExpコンストラクタを使用して作成された正規表現は異なり、ECMAScript 3では字面量は常に同じRegExpインスタンスを共有し、コンストラクタによって作成された新しいRegExpはすべて新しいインスタンスである.ECMA 5で同じ(2)source属性に保存されているのは,正規形式の文字列,すなわち字面量形式の文字列である.global,multiline,lastIndex,ignoreCaseプロパティも含まれています!(3)IEでは非グローバルモードでもlastIndexは常に変化する!(4)RegExpのtoLocalStringとtoStringは、作成方法に関係なく正規表現の字面量を返します!(5)正規表現のvalueOfは正規表現そのものを返します!(6)正規表現の長い属性名と短い属性名はexecとtestメソッドからより具体的な情報を取り出すことができるが,Operaは短い属性名をサポートしない!(7)RegExp.$1で最初のキャプチャグループにアクセスでき、順番に類推でき、test、execメソッドなど(8)input($)で最近の二次マッチングを表す文字列、lastMatch($&)最近のマッチング項目、leftContext($`)でlastMatchの前の文本、rightContext($')lastMatchの右側のテキスト、multilineで複数行マッチングがサポートされているか!LastParen($+)の最近のキャプチャグループ.OperaはleftContexとrightContext IEのみをサポートmultiline属性はサポートしていません!
Stringオブジェクトのreplaceメソッド:
(1)1番目のパラメータはマッチングを実行する正規表現を表し、文字列を渡すこともでき、2番目のパラメータはマッチングの代わりに準備された文字列を表し、つまり2番目のパラメータで1番目のパラメータの内容を置き換えることもできる.(2)replaceメソッドは文字列を正規表現に変換するのではなく,文字列直接量のテキストモードでマッチングし,2番目のパラメータは置換テキスト,またはマッチングテキストを生産する関数であってもよい.(3)正規表現がグローバルである場合、すべての一致文字列が置換されます.そうでない場合、最初の一致文字列のみが置換されます.
(4)replaceメソッドが入力する最初のパラメータは、一致するたびにテキストであり、次いで$2....$nはキャプチャグループの値であり、次のパラメータは一致するテキストの下付きであり、次のパラメータは一致を実行する文字列であり、つまりreplaceメソッドを呼び出す文字列であり、ずっと変わらない!
          var s='script language="javascript" type=" text/javascript "';
		   var f=function($1)
		   {
		      return $1.substring(0,1).toUpperCase()+$1.substring(1);
		   }
		   //             \b      ,      !
		   //             :       (     ),          ,              
		   //             !
		   var a=s.replace(/(\b\w+\b)/g,f);
		   //  Script Language="Javascript" Type=" Text/Javascript "
		   console.log(a);
この例では、すべての単語の頭文字の大文字を実現していますが、正規表現が私たちに与えたすべてのパラメータを完全に利用していないので、次の変更を行うことができます.
                 var f=function($1,$2,$3)
		   {
		      return $2.toUpperCase()+$3;
		   }
		   //             \b      ,      !
		   //             :       (     ),          ,              
		   //             !
		   var a=s.replace(/\b(\w)(\w*)\b/g,f);
		   console.log(a);
この時私はとても好奇心があって、もしmatchならばどのようにします
                 var s='script language="javascript" type=" text/javascript "';
		   var result=s.match(/\b(\w)(\w*)\b/g);
		   //  ["script", "language", "javascript", "type", "text", "javascript"]
		   console.log(result)
次にmatchとexecの違いを示します.
 表1:(matchとexecメソッドの違い)
 
グローバル(g)
非グローバル
キャプチャグループあり
(1)execが返す配列は最初の一致文字列とキャプチャグループのデータのみを含み,複数回呼び出されるとlastIndexによって新しい結果が返される(2)matchによってすべての一致した結果が返され,キャプチャグループは含まれず,$nによってキャプチャグループがアクセスする
(1)matchメソッドはexecメソッドと同様に最初の一致文字列とキャプチャグループを返すだけである.
キャプチャグループなし
(1)execは最初の一致要素のみを返し,matchはすべての一致要素を返す(2)このRegExpでexecメソッドを複数回呼び出すと,新しい結果が返される!
(1)matchメソッドはexecメソッドと一致し,最初の一致文字列グループを返すだけである.
         note:非グローバルでmatchはexecと同じです.グローバルモードでは、execは最初の一致文字列とキャプチャグループを含むだけで、matchはすべての一致の結果を返します!
例1:(読書クリックでリンクを開く)
ループ構造によるexecの繰り返し呼び出しは、正規表現がグローバルモードであるかどうかにかかわらず、戻り配列に完全な情報が追加されるグローバルモードの完全なモードマッチング情報を得る唯一の方法である.文字列オブジェクトのmatchメソッドは異なり、グローバルモードで返される配列にはそれほど詳細な情報は含まれません.
vars="java";
var r=/\w/g;
while((a=r.exec(s))!=null)
{
//a.length 1,a[0]           ,index              ,input         
//a.input          ,   "java"
//a[0]     j,    a,    v,    a
//a.index     0,    1,    2,    3
 alert(a.length+"
"+a[0]+"
"+a.index+"
"+r.lastIndex+"
"+a.input); }

注意:上記の正規表現のgを削除するとlastIndexは存在しないので、印刷するたびに[1,“j”,0,0,“java”]と同じ結果になります.この図を見ると、グローバルモードのexecに保存されているすべての情報が見つかります.
例2:(正規表現の貪欲と怠惰の使い方)
var s="abcd-abcd-abcd";
var reg=/(abcd-?)*/;
var result=s.match(reg);
//  [abcd-abcd-abcd,abcd]        0   1 ,     !
alert(result);

//(1)    "",           ""
//(4)         *?   !
//  :*?     ,                       !
var s1="< html>< html >< /html> html>< / html >//html>";
var reg1=//g;
alert(s1.match(reg1));

//  [

title

,

text

] //
n , : ! // , 。 , ! var s2="

titile

text

"; var reg2=/().*\1/g; alert(s2.match(reg2)); // var s3="aa11bb22c3d4e5f6"; var reg3=/(\w+?)(\d+)/g; alert(s3.replace(reg3,"$2$1"));