0

この質問に適切なタイトルを付けるのに少し苦労しました。以下は、私が欲しいものの例です。

var originalString ="hello all, This is a hello string written by hello";
var substringToBeCounted = "hello";
var expectedString ="1 hello all, This is a 2 hello  string written by 3 hello; .

文字列全体に「hello」のインスタンス数を追加しようとしています。

これは私がこれまでに得た実用的なソリューションです:

   var hitCount = 1;
        var magicString = "ThisStringWillNeverBePresentInOriginalString";
        while(originalString .match(substringToBeCounted ).length >0){

                            originalString = originalString .replace(substringToBeCounted , hitCount + magicString  );
                            hitCount++;
                    }

    var re = new RegExp(magicString,'gi');

    originalString = originalString.replace(re, subStringToBeCounted);

上記のコードを説明するには: match が元の文字列で "hello" を見つけるまでループし、ループ内で hello を必要な数の奇妙な文字列に変更しています。

最後に、奇妙な文字列を hello に戻しています。

この解決策は私にとって非常にハックに見えます。

この問題に対処する賢い解決策はありますか。

ありがとう

4

1 に答える 1

4

Replace は関数を置換として受け入れます。そうすれば、あなたが望むものを返すことができます

var originalString = "hello all, This is a hello string written by hello";
var substringToBeCounted = "hello";

var count = 0;
var reg = new RegExp(substringToBeCounted, 'g');
// this could have just been /hello/g if it isn't dynamically created

var replacement = originalString.replace(reg, function(found) {
  // hint: second function parameter is the found index/position
  count++;
  return count + ' ' + found;
});

これをもう少し再利用可能にするには:

function counterThingy(haystack, needle) {
  var count = 0;
  var reg = new RegExp(needle, 'g');

  return haystack.replace(reg, function(found) {
    count++;
    return count + ' ' + found;
  });
}

var whatever = counterThingy(originalString, substringToBeCounted);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

于 2013-10-04T20:56:23.897 に答える