23

置換する必要がある一連の文字列がありますが、文字の大文字と小文字を区別する必要があります。

入力語と出力語はどちらも同じ長さです。

たとえば、「abcd」を「qwer」に置き換える必要がある場合は、次のようになります。

"AbcD" translates to "QweR"
"abCd" translates to "qwEr"

等々。

現在、JavaScript の を使用していますreplaceが、変換時に大文字が失われます。

r = new RegExp( "(" + 'asdf' + ")" , 'gi' );
"oooAsdFoooo".replace(r, "qwer");

どんな助けでも大歓迎です。

4

9 に答える 9

1

Ryan O'Hara の回答を拡張すると、以下のソリューションは charCodes の使用と、それらを使用する際に発生する可能性のある問題を回避します。また、文字列の長さが異なる場合でも、置換が確実に完了します。

function enforceLength(text, pattern, result) {
  if (text.length > result.length) {  
    result = result.concat(text.substring(result.length, text.length));
  }

  if (pattern.length > text.length) {
    result = result.substring(0, text.length);
  }

  return result;
}

function matchCase(text, pattern){
  var result = '';

  for (var i =0; i < pattern.length; i++){
    var c = text.charAt(i);
    var p = pattern.charAt(i);

    if(p === p.toUpperCase()) {
       result += c.toUpperCase();
    } else {
       result += c.toLowerCase();
    }
  }  
  return enforceLength(text, pattern, result);
}
于 2016-02-20T14:22:45.480 に答える
1

次のような独自の置換関数を作成できます

 if(!String.prototype.myreplace){
String.prototype.myreplace = (function(obj){
    return this.replace(/[a-z]{1,1}/gi,function(a,b){
       var r = obj[a.toLowerCase()] || a;
        return a.charCodeAt(0) > 96? r.toLowerCase() : r.toUpperCase();
    });
});
}

これは、異なる文字をマップするオブジェクトを取り込みます。そして、次のように呼び出すことができます

  var obj = {a:'q',b:'t',c:'w'};

  var s = 'AbCdea';
  var n = s.myreplace(obj);
  console.log(n);

これは、必要に応じて、異なるオブジェクトを異なるマッピングで渡す可能性があることを意味します。これは例を示す簡単なフィドルです(オブジェクトはすべて小文字ですが、関数自体は文字列の大文字と小文字も調べます)

于 2013-06-24T08:59:28.257 に答える