別の文字列の位置xに文字列を挿入する


237

2つの変数があり、で表される点で文字列bに文字列を挿入する必要があります。私が探している結果は「リンゴが欲しい」です。JavaScriptでこれを行うにはどうすればよいですか?aposition

var a = 'I want apple';
var b = ' an';
var position = 6;

回答:


376

var a = "I want apple";
var b = " an";
var position = 6;
var output = [a.slice(0, position), b, a.slice(position)].join('');
console.log(output);


オプション:Stringのプロトタイプメソッドとして

以下は、オプションのパラメーターを使用して、text別の文字列内のでスプライスするために使用できます。indexremoveCount

if (String.prototype.splice === undefined) {
  /**
   * Splices text within a string.
   * @param {int} offset The position to insert the text at (before)
   * @param {string} text The text to insert
   * @param {int} [removeCount=0] An optional number of characters to overwrite
   * @returns {string} A modified string containing the spliced text.
   */
  String.prototype.splice = function(offset, text, removeCount=0) {
    let calculatedOffset = offset < 0 ? this.length + offset : offset;
    return this.substring(0, calculatedOffset) +
      text + this.substring(calculatedOffset + removeCount);
  };
}

let originalText = "I want apple";

// Positive offset
console.log(originalText.splice(6, " an"));
// Negative index
console.log(originalText.splice(-5, "an "));
// Chaining
console.log(originalText.splice(6, " an").splice(2, "need", 4).splice(0, "You", 1));
.as-console-wrapper { top: 0; max-height: 100% !important; }


3
長い文字列の場合、このソリューションはnickfのソリューションよりも高速です(コピーが少ないため)。
PTS

35
このソリューションは高速ではありません。私はこれに興味があり、jsperfを実行しました。これは将来これを読む人への注意です。 jsperf.com/javascript-string-splice。最新のFF / Chrome / IE10 / IE9でテスト済み。私は、明快さとパフォーマンスの両方のために、これよりも細いnickfのアプローチを使用します。
junkyspace 2013

3
まあ、それは非常に可能です。ここでの答えはほぼ3年前のものであり、当時のブラウザとバージョンの大部分は、確かに配列結合(特にIE)を使用した方がはるかに高速に実行されました。
jAndy 2013

1
このような古い質問が復活したことをご容赦ください。しかし、私にとって価値のあることはvar output = [a.slice(0, position + 1), b, a.slice(position)].join('');、OPに「I wantan apple」ではなく「I wantan apple」を与えることです。
paulvs 2013

13
@PaulVon何かを修正することは決して間違いではないので、許す必要はありません。とにかく、私はちょっと同意しません。関数は、意図したとおりに機能し、別の文字列内の特定の位置に文字列を挿入します。実際には、挿入された文字列は "an"のようになっているはずです。これは、この場合により正確になります。
jAndy

261
var output = a.substring(0, position) + b + a.substring(position);

編集:がレガシー関数になったために置き換えられ.substrまし.substring.substrhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substrによる


47
@junkyspace jsperf.com/javascript-string-spliceによると、この回答はjAndyの回答より640 倍高速です。
Paulo Coghi-モニカを2016年

5
String.prototype.substrは非推奨になりました。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Tivie

2
substring この場合は、非推奨のの直接的な置き換えな substrので、答えはになりますvar output = a.substring(0, position) + b + a.substring(position);
Seafish

完全に非推奨ではありませんが、レガシーなので、非推奨になる可能性が高いため、置き換えることをお勧めします.substring
。MDNで

32

この関数を文字列クラスに追加できます

String.prototype.insert_at=function(index, string)
{   
  return this.substr(0, index) + string + this.substr(index);
}

これを任意の文字列オブジェクトで使用できるようにします。

var my_string = "abcd";
my_string.insertAt(1, "XX");

3
:ネイティブオブジェクトのプロトタイプ変更する悪い習慣であるstackoverflow.com/questions/14034180/...
jhujhul

10

ES6文字列リテラルを使用すると、はるかに短くなります。

const insertAt = (str, sub, pos) => `${str.slice(0, pos)}${sub}${str.slice(pos)}`;
    
console.log(insertAt('I want apple', ' an', 6)) // logs 'I want an apple'


9

おそらく、次のようにindexOf()を使用して位置を決定する方が良いでしょう。

function insertString(a, b, at)
{
    var position = a.indexOf(at); 

    if (position !== -1)
    {
        return a.substr(0, position) + b + a.substr(position);    
    }  

    return "substring not found";
}

次に、このような関数を呼び出します:

insertString("I want apple", "an ", "apple");

関数の呼び出しでは、returnステートメントではなく「an」の後にスペースを入れていることに注意してください。


2
これは要求されたものではありません。これが当てはまる場合でも、「at」部分文字列が複数ある場合は機能しません
elachell

6

Underscore.Stringのライブラリにはない機能を有するインサートを

insert(string、index、substring)=>文字列

そのようです

insert("Hello ", 6, "world");
// => "Hello world"

私によるものではありませんが、おそらくその質問にそのライブラリーについての言及がなかったためです。しかし、彼はまた.. IMO他のライブラリを除外していないようだ
Dennis98

1
必要でない限り、ライブラリの使用は嫌いですが、反対票を相殺することに賛成しました:P
froggomad

3

試す

a.slice(0,position) + b + a.slice(position)

または正規表現ソリューション

"I want apple".replace(/^(.{6})/,"$1 an")


2
var array = a.split(' '); 
array.splice(position, 0, b);
var output = array.join(' ');

これは遅くなりますが、anの前後にスペースが追加されるので、位置の値を変更する必要があります(2に変更すると、より直感的になります)。


2

クイックフィックス!手動でスペースを追加したくない場合は、これを行うことができます。

var a = "I want apple";
var b = "an";
var position = 6;
var output = [a.slice(0, position + 1), b, a.slice(position)].join('');
console.log(output);

(編集:これは実際に上記で回答されているようです。申し訳ありません!)


2

ES2018の後読みが利用できる場合、もう1つの正規表現ソリューションで、N番目の文字の後のゼロ幅の位置で「置換」します(@KamilKiełczewskiと似ていますが、最初の文字をキャプチャグループに保存しません):

"I want apple".replace(/(?<=^.{6})/, " an")


1

上記のソリューションが出力するので、まあ小さな変更です

"リンゴが欲しいです"

の代わりに

"リンゴが欲しいです"

出力を次のように取得するには

"リンゴが欲しいです"

次の変更されたコードを使用します

var output = a.substr(0, position) + " " + b + a.substr(position);

13
はい、おそらくこの場合は望ましくありませんが、自動的に余分なスペースを追加することは、すべての場合にほぼ間違いなく望ましくありません。
nickf

12
正しい解決策はstring = 'an'にスペースを追加することではありません。この方法で関数を再利用できます
Tosh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.