JSにおけるexec,match,replace,testメソッドの比較
5490 ワード
正規表現の様々な方法の使い方と比較(詳細は参照)
RegExpのexecメソッドのまとめ:
(1)0番目の要素が式に一致するテキスト
(2)1番目の要素はサブエクスプレッションに一致するテキストであり,グループをキャプチャする.
(3)戻り値が配列であることは明らかである.
(4)戻り配列にはlength,index(テキストの最初の文字位置に一致)、input(文字列全体)属性がある
(5)非グローバルな正規実行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メソッドを呼び出す文字列であり、ずっと変わらない!
表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メソッドは異なり、グローバルモードで返される配列にはそれほど詳細な情報は含まれません.
注意:上記の正規表現のgを削除するとlastIndexは存在しないので、印刷するたびに[1,“j”,0,0,“java”]と同じ結果になります.この図を見ると、グローバルモードのexecに保存されているすべての情報が見つかります.
例2:(正規表現の貪欲と怠惰の使い方)
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"));