ホームページ  >  記事  >  ウェブフロントエンド  >  string replace method_javascript スキルのアプリケーションの簡単な分析

string replace method_javascript スキルのアプリケーションの簡単な分析

WBOY
WBOYオリジナル
2016-05-16 17:58:451152ブラウズ

両方のパラメータが必要です。 replace() メソッドのパラメータ置換には、文字列の代わりに関数を使用できます。この場合、関数は一致するたびに呼び出され、関数が返す文字列が置換テキストとして使用されます。この関数の最初のパラメータは、パターンに一致する文字列です。次の引数は、パターン内の部分式に一致する文字列であり、そのような引数は 0 個以上存在できます。次のパラメータは、一致が発生する stringObject 内の位置を宣言する整数です。最後のパラメータは stringObject 自体です。置き換えが機能である場合、これは非常に便利です。



これは、2 つの単語の順序を交換する非常に簡単な例です。置換せずにこれを実行できます。

コードをコピーします。 コードは次のとおりです:

(function(){
var str = 'click dblclick';
var result = str.split( /b/ ).reverse().join('')
console.log(result);
})()

これは少し面倒ですが、 replace を使用するとさらにすっきりします。
コードをコピーします。 コードは次のとおりです。

(関数) (){
var str = 'クリック dblclick';
var result = str.replace(/b(w )(s )(w )b/,'$3$2$1'); log(result);
} )();

数値に 1000 分の 1 を追加する例を見てください:

コードは次のとおりです:
(function(){
var 数値 = 12345678900;
var result = ('' 数値).replace (/(d)(?= (d{3}) $)/g,'$1,');



しかし、ここで重要なのは関数として replace を使用することなので、上記の形式を関数形式に変更する必要はありません:



コードをコピー コードは次のとおりです: (function(){
var str = 'click dblclick';
var result = str.replace(/ b(w )(s )(w )b/, function(all,$1,$2,$3){
return $3 $2
}); >})();

( function(){
var 数値 = 12345678900;
var result = ('' 数値).replace(/(d)(?=(d{3 }) $)/g,function(all,$1) {
return $1 ','
});
console.log(result);


したがって、置換は一致をキャプチャすることにすぎません。項目はその後処理され、戻り値として置換されます。これは関数の比較にすぎません。
より実用的な例を見てみましょう。C 言語の printf など、ほとんどの言語にはフォーマットされた出力があります。



コードをコピーします

コードは次のとおりです: (function(){ var str = '%s は消えた可能性がありますが、%s の時間があります'; var result = str .replace(/(%s)/g,function(){ return 'replacement';
})
console.log(result)
})()


ここでの問題は、%s はすべて同じであり、置換されるときも同じであり、段落を追加した場合、その順序に従ってのみどの部分が置換されるかを判断できることです。変更する必要があります。したがって、変数を渡す必要があります。



コードをコピー

コードは次のとおりです。 (function(){ var array = [ 'Swallows','return']; var i = 0; var str = '%s は消えたかもしれませんが、%s の時間はあります'; .replace( /(%s)/g,function(){
return array[i ];
})
console.log(result)
})(); (function( ){
var str = '#{what} はなくなったかもしれないが、#{how} の時がある';
var obj = {
what : 'Swallows',
how : 'return'
}
var result = str.replace(/(?:#{(w )})/g,function(all,$1){
return obj[$1];
})
console.log( result);
})();


明らかに、オブジェクト メソッドの方が信頼性が高くなります。

同時に、js にはそれほど厳密な型要件がないため、%s という形式も制限になりました。それを直接放棄して、私たちにわかりやすい形式に置き換えます。

は関数として偽装されています:



コードをコピーします


コードは次のとおりです:

(function(){
function gsub(str,replaceObj){
return str.replace(/(?:#{(w )})/g,function(all,$1) {
return replaceObj[$1];
})
}
console.log('gsub result:',gsub('#{what} がなくなった可能性がありますが、# {how}',{
what : 'Swallows',
how : 'return'
}))
})();

上記の gsub から借用Prototype の gsub メソッドの名前は変更されましたが、Prototype の gsub は replace を使用しませんが、形式は非常に似ています。

私たちが現在直面している問題は次のとおりです:

#{what} この形式の競合問題には、たまたまこの形式の文字列が含まれている可能性があります。これに対処しないと、次のような結果が生じます。誰もがそれを知っています。

最初の解決策: 正規表現にはエスケープ文字があり、エスケープ文字を使用することもできるので、不要な置換部分の前に '' を追加するだけです。

2 番目の解決策: 許可ユーザーはフラグをカスタマイズして #{} フラグを置き換えて競合を避けることができます。

最初のメソッドを見てください:
コードをコピーします コードは次のとおりです:

(function(){
var str = '#{何を} してしまったかもしれないが、#{how},\#{reserve} の時期がある';
function gsub(str, replaceObj){
return str.replace(/(^|.)(?:#{(w )})/g,function(all,$1,$2){
if($1 == '\' ){
return '#{' $2 '}';
return $1 replaceObj[$2]
})
}
console.log('gsub result:' ,gsub(str ,{
何を : 'Swallows',
どのように : 'return'
}))
})();

何が必要か上で述べたように、'' は文字列内にもエスケープ文字があり、記述するときにエスケープする必要があります。

2 番目の方法:

「#{what}」を <%what%> の形式に置き換えます。

コードをコピー コードは次のとおりです。
(function(){
function gsub(str ,replaceObj,regexp){
regexp = regexp || /(?:#{(w )})/g;
return str.replace(regexp,function(all,$1){
return replaceObj [$1];
})
}
var str = ' がなくなった可能性がありますが、<%how%>,#{予約}' ;
console.log('gsub result:',gsub(str,{
内容 : 'ツバメ',
方法 : '返却'
},/(?:< %(w )%>)/g))
})();

今度は String のプロトタイプに gsub をハングします

コードをコピーします コードは次のとおりです。
String.prototype.gsub = function(replaceObj,regexp){
regexp = regexp || /(^|.) (?:(#{)(w )(}))/g;
return this.replace(regexp,function(all,$1,$2,$3,$4){
if ($1 == '\ '){
return $2 $3 $4;
return $1 replaceObj[$3] ;
}
var str = '<% what%> はなくなったかもしれませんが、<%how%>,\<%how%>,#{how}';
var obj = {
what : 'ツバメ',
どのように: 'return'
}
console.log('テスト 1:',str.gsub(obj,/(^|.)(?:(<%)(w )(%>) )/g));
//ツバメは行ってしまったかもしれないが、戻ってくる時が来る、<%how%>,#{how}
console.log('テスト 2:',str .gsub(obj));
//<%what%> は終了したかもしれませんが、<%how%>、<%how%> の時間があります。 ,return


へー、Prototype の gsub とよく似ているようですが、Prototype の gsub はより複雑で、原理が一貫していません。それに慣れて、Prototype の gsub メソッドを詳細に分析してください。後で。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。