JSの正規表現(五)


execメソッドの詳細
execメソッドの戻り値
execメソッドが返すのは、結果文字列に一致するのではなく、オブジェクトです.execReg関数を簡単に修正して、実験をすればそれを証明することができます.
<script  type="text/javascript">
	function  execReg(reg,str){
 	var result =  reg.exec(str);
		 alert(typeof result);
		}
		var reg = /c/;
		var  str='crazy';
		execReg(reg,str);
</script>
 
結果はresultのタイプがobjectであることを示した.配列に似たオブジェクトです.for inを使用すると、その属性:index input 0がわかります.ここでindexは、元の文字列に一致するインデックスを表す.Inputは入力を表す文字列です.
0は一致結果が1つしかないことを示し、この一致結果を下付き0で参照することができ、この数は変更される可能性があります.値のlengthプロパティを返すことで、一致結果の合計数を知ることができます.
上記の戻り値の解析に基づいて、execReg関数を以下のように変更します.
<script  type="text/javascript">
	function  execReg(reg,str){
		 var result =  reg.exec(str);
		 document.write('index:'+result.index+'<br  />'
		 +'input:'+result.input+'<br  />'
		 );
		 for(i=0;i<result.length;i++){
		 document.write('result['+i+']:'+result[i]+'<br  />')
		 }
		}
		var reg = /c/;
		var  str='crazy';
		execReg(reg,str);
</script>

結果は次のとおりです.
index:0 input:crazy result[0]:c
一致するcの元の文字列のインデックスは0です.
正則的なマッチング結果は1つ、cである.
<script  type="text/javascript">
	function  execReg(reg,str){
		 var result =  reg.exec(str);
		 document.write('index:'+result.index+'<br  />'
		 +'input:'+result.input+'<br  />'
		 );
		 for(i=0;i<result.length;i++){
		 document.write('result['+i+']:'+result[i]+'<br  />')
		 }
		}
		var reg =  /(\w)(\w)(.+)/;
		var  str='crazy.com';
		execReg(reg,str);
</script>

上記の2つの例から分かるように、戻りオブジェクト[0]は正規表現全体が一致する内容である.後続の要素は、各サブ正規表現の一致です.
execメソッドによる正規表現の更新
execメソッドは、結果オブジェクトを返すと同時に、元の正規表現を更新する可能性があります.これは、正規表現がg修飾子を設定しているかどうかによって決まります.まず2つの例を見てみましょう.
 
<script  type="text/javascript">
	function  execReg(reg,str){
		 var result =  reg.exec(str);
		 document.write('index:'+result.index+'<br  />'
		 +'input:'+result.input+'<br  />'
		 );
		 for(i=0;i<result.length;i++){
		 document.write('result['+i+']:'+result[i]+'<br  />')
		 }
		}
		var reg =  /(\w)(\w)(.+)/;
		var  str='crazy.com';
		execReg(reg,str);
		execReg(reg,str);
</script> 

結果:
index:0 input:crazy.com result[0]:crazy.com result[1]:c result[2]:r result[3]:azy.com index:0 input:crazy.com result[0]:crazy.com result[1]:c result[2]:r result[3]:azy.com
すなわち,2回のマッチングの結果はまったく同じであり,インデックスから文字列の先頭のc文字が一致していることがわかる.
gを設定した正規表現の表現を見てみましょう.
<script  type="text/javascript">
	function  execReg(reg,str){
		 var result =  reg.exec(str);
		 document.write('index:'+result.index+'<br  />'
		 +'input:'+result.input+'<br  />'
		 );
		 for(i=0;i<result.length;i++){
		 document.write('result['+i+']:'+result[i]+'<br  />')
		 }
		}
		var reg =  /c/g;
		var  str='ccrazy.com';
		execReg(reg,str);
		execReg(reg,str);
</script>
 
index:0 input:ccrazy.com result[0]:c index:1 input:ccrazy.com result[0]:c
2回目に一致するのは文字列の文字列の2番目のbであることがわかる.これがg修飾子の役割であり、execがgと非gの正規表現をどのように区別しているかを見てみましょう.
正規表現にgが設定されていない場合、execメソッドは正規表現に影響を与えません.gが設定されている場合、exec実行後に正規表現のlastIndex属性が更新され、今回の一致後、一致する文字列の次の文字のインデックスが表示されます.次にこの正規表現で文字列をマッチングすると、前回のlastIndexプロパティからマッチングが始まります.つまり、上記の2つの例の結果が異なる理由です.
testメソッド
testメソッドはstrが一致するかどうかを確認し、成功したかどうかを示すためにブール値を返します.同様に簡単なテスト関数を作成します
1.
<script  type="text/javascript">
	function  testReg(reg,str){
		 alert(reg.test(str));
	}
		var reg =  /c/;
		var  str='ccrazy.com';
		testReg(reg,str);
</script>

成功しました.trueを出力します.
2.
<script  type="text/javascript">
	function  testReg(reg,str){
		 alert(reg.test(str));
	}
		var reg =  /c/;
		var  str='ccrazy.com';
		testReg(reg,str);
</script>

失敗、falseの出力
文字列メソッドを使用した正規表現の実行
matchメソッド
形式:str.match(reg);
正規表現のexecメソッドと同様に、inputおよびindexプロパティも同様に配列のオブジェクトを返します.テストに使用する関数を定義します.
<script  type="text/javascript">
	function  matchReg(reg,str){
		 var result =  str.match(reg);
		 if(result ){
		 document.write('index:'+result.index+'<br  />'
		 +'input:'+result.input+'<br  />'
		 );
		 for(i=0;i<result.length;i++){
		 document.write('result['+i+']:'+result[i]+'<br  />')
		 }
		 }else{
		 alert('null:    !')
		 }
		}
		var reg =  /c/;
		var  str='ccrazy.com';
		matchReg(reg,str);
</script>

結果:
index:0 input:ccrazy.com result[0]:c
execの結果と同じであることがわかります.
しかし、正規表現にg修飾子が設定されている場合、execとmatchの動作は異なります.
义齿
形式:str.replace(reg,’new str’);
str文字列の中でregに一致する部分を「new str」部分コードとして用いる役割を果たし、元の文字列は修正されず、戻り値として返されることに注目すべきである.例:
<script  type="text/javascript">
	var reg = /b/;
	var str =  'crazyb';
	var newStr =  str.replace(reg,'c');
	document.write(newStr);
</script>

結果:crazyc
<script  type="text/javascript">
	var reg = /c/g;
	var str =  'crazy.com';
	var newStr =  str.replace(reg,'b');
	document.write(newStr);
</script>

結果:
brazy.bom
g修飾子が設定されているため、bはすべて置き換えられます.
replace関数で$参照サブ正規表現を使用してコンテンツを一致させる
正規表現で最初のサブ正規表現が一致する内容を参照するために1を使用することができるように、replace関数の置換文字でも$1を使用して同じ内容を参照することができます.
例を見てみましょう
<script  type="text/javascript">
	var reg=/(\w+).(\w+).(\w+)/
	var str = 'crazy.com.cn';
	var newStr = str.replace(reg,'$1.$1.$1');
	document.write(newStr);
</script>

実行結果:crazy.crazy.crazy
まず、最初のサブ正規表現がcrazyに一致することを知っています.$1はcrazyを表します.その後、置換文字列を'$1.$に設定します.1.$1'、実は「crazy.crazy.crazy」です.同じように、$2はcom、$3はcnです.
一例を見ると、スペースの前後の2つの単語の順序を逆にします.
searchメソッドとsplitメソッド
同様に、文字列のsearchメソッドとsplitメソッドでも正規表現を使用できます.形式は次のとおりです.
str.search(reg);
searchは正規表現が最初に一致した位置を返します.例:
<script type="text/javascript">
var reg = /big/;
var str = 'crazybig';
var pos =  str.search(reg);
document.write(pos);
</script>

結果は次のとおりです.
次の例では、最初の単語以外の文字を見つけます.
<script type="text/javascript">
var reg = /\W/;
var str =  'crazy.com.cn';
var pos =  str.search(reg);
document.write(pos);
</script>

結果:5