JavaScriptを使用して文字列から文字を削除するにはどうすればよいですか?


363

私はこれを手に入れようとしていますが、それは正しくありません。r文字列から文字を削除するだけです。問題は、r文字列に複数ののインスタンスがあることです。ただし、これは常にインデックス4の文字です(つまり、5番目の文字)。

文字列の例: crt/r2002_2

私が欲しいもの: crt/2002_2

この置換機能は両方を削除します r

mystring.replace(/r/g, '')

生成する: ct/2002_2

私はこの機能を試しました:

String.prototype.replaceAt = function (index, char) {
    return this.substr(0, index) + char + this.substr(index + char.length);
}
mystring.replaceAt(4, '')

別のキャラクターに置き換えた場合にのみ機能します。単に削除するだけではありません。

何かご意見は?


ここで問題は何ですか、「r」はすべて削除されましたか?
Vladimir Despotovic

回答:


476
var mystring = "crt/r2002_2";
mystring = mystring.replace('/r','/');

置換する/r/使用String.prototype.replace

または、グローバルフラグを指定した正規表現を使用して(以下のErik ReppenSagar Galaが推奨)、すべての出現箇所

mystring = mystring.replace(/\/r/g, '/');

編集: ここではみんながとても楽しんでいて、明確な質問に答えるためにuser1293504がすぐに戻ってくるわけではないので、文字列からN番目の文字を削除する方法を次に示します:

String.prototype.removeCharAt = function (i) {
    var tmp = this.split(''); // convert to an array
    tmp.splice(i - 1 , 1); // remove 1 element from the array (adjusting for non-zero-indexed counts)
    return tmp.join(''); // reconstruct the string
}

console.log("crt/r2002_2".removeCharAt(4));

user1293504はゼロインデックスのカウントの代わりに通常のカウントを使用したため、これを使用して動作を再現したい場合charAtは、3行目のインデックスから1を差し引いてtmp.splice(i, 1)代わりに使用しないでください。


3
4番目の文字は必ずしもaではありません"/"
jak.b

74

単純な関数型javascriptの方法は

mystring = mystring.split('/r').join('/')

シンプルで高速、グローバルに置き換えられ、関数やプロトタイプは不要


3
それは私にとって素晴らしい働きをします。mystring = mystring.replace( '/ r'、 '/');を試してみます。最初の修正子のみを変換し、残りはそのままです。
rb vishnu 2015

1
私はそれが最良の解決策であり、非常にシンプルであり、あなたはそれのための正規表現を知る必要がないと思います!
商業自殺

2
4番目の文字は必ずしもaではありません'/'
jak.b

1
とにかく、テスト(stackoverflow.com/questions/50463850/…)によると、高パフォーマンス(1秒あたり1万回のオペレーション)のJavaScriptを記述しない限り、パフォーマンスの違いは問題ではなく、「高額の支払い」でもないため、コメントの正確さはわかりませんソリューションへの貢献
Strife86

非効率的であること(およびこのような関数は、重要な長いリストで繰り返し使用される場合があります)を除いて、前の文字ではなく、インデックスに依存するOPの質問には答えません。
aamarks

49

常に4番目の文字を削除することがわかっている場合は、常に文字列関数があります。

str.slice(0, 4) + str.slice(5, str.length))

最初または最後の文字を削除する場合、これは機能しません
TekTimmy

3
@TekTimmyどうして?str.slice(0, 0) + str.slice(1, str.length)最初をstr.slice(0, str.length-1) + str.slice(str.length, str.length)削除し、最後を削除します。(もちろん、最初と最後を常に削除していることがわかっている場合は、冗長な部分を削除しますが、それらが変数の場合は、他のインデックスと同様に機能します。)
JJJ

30

最初の機能はほぼ正しいです。'global'(編集)を表す 'g'フラグを削除し、2番目の 'r'を見つけるためのコンテキストを与えます。

編集:それが前に2番目の「r」であることがわからなかったため、「/」を追加 regEx引数を使用する場合、「/」をエスケープするには¥/が必要です。賛成投票に感謝しますが、私は間違っていたので、regExの基本をよりよく理解することに関心のある人のために詳細を修正して追加しますが、これでうまくいきます。

mystring.replace(/\/r/, '/')

過度の説明のために:

regExパターンを読み書きするときは、<文字または文字のセット>の後に<文字または文字のセット>の後に<...

regExでは、<文字または文字セット>は一度に1つになります。

/each char in this pattern/

したがって、e、a、cなどのように読みます。

または、単一の<文字または文字セット>は、文字クラスによって記述された文字である可能性があります。

/[123!y]/
//any one of these
/[^123!y]/
//anything but one of the chars following '^' (very useful/performance enhancing btw)

または、文字の数に一致するように拡張されます(ただし、シーケンシャルパターンに関して単一の要素と考えるのが最善です):

/a{2}/
//precisely two 'a' chars - matches identically as /aa/ would

/[aA]{1,3}/
//1-3 matches of 'a' or 'A'

/[a-zA-Z]+/
//one or more matches of any letter in the alphabet upper and lower
//'-' denotes a sequence in a character class

/[0-9]*/
//0 to any number of matches of any decimal character (/\d*/ would also work)

だから一緒に束を滑らかにする:

   var rePattern = /[aA]{4,8}(Eat at Joes|Joes all you can eat)[0-5]+/g
   var joesStr = 'aaaAAAaaEat at Joes123454321 or maybe aAaAJoes all you can   eat098765';

   joesStr.match(rePattern);

   //returns ["aaaAAAaaEat at Joes123454321", "aAaAJoes all you can eat0"]
   //without the 'g' after the closing '/' it would just stop at the first   match and return:
   //["aaaAAAaaEat at Joes123454321"]

そしてもちろん、私は過度に精緻化してきましたが、私のポイントは単に次のことです:

/cat/

一連の3つのパターン要素です(モノ、モノ、モノの順)。

これもそうです:

/[aA]{4,8}(Eat at Joes|Joes all you can eat)[0-5]+/

regExの外観が奇妙になってくると、すべてが次々と順番に続く一連の事柄(潜在的に複数文字の事物)に分解されます。基本的なポイントですが、過ぎ去るのに少し時間がかかったので、OPやregExの新しい他の人たちが何が起こっているのかを理解するのに役立つと思うので、ここで説明しました。regExの読み取りと書き込みの鍵は、regExをこれらの部分に分解することです。


13

'/ r'をグローバルに置き換える場合、このコードは私にとってはうまくいきました。

mystring = mystring.replace(/\/r/g,'');

8

ただあなたを修正してくださいreplaceAt

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

mystring.replaceAt(4, 1);

removeAt代わりにそれを呼び ます。:)


1
これは実際にはOPの問題を解決し、ほとんど賛成票を獲得しませんが、上位2つの回答は元の質問を解決しません!
aamarks

5
return this.substr(0, index) + char + this.substr(index + char.length);

char.lengthゼロです。1この場合、キャラクターをスキップするために追加する必要があります。


これは質問の答えにはなりません。なぜ機能しreplaceAtないのかを簡単に説明しています。回答ではなく、元の質問に対するコメントにする必要があります。:)
ケンホワイト

@KenWhite、事実、それは唯一の質問の質問に答えますAny thoughts?
Ash Burlaczenko 2012年

けっこうだ。同意しませんが... :)反対投票はしませんでしたが、回答として認められるとは思いません。答えは問題の解決策を提供するか、少なくともより詳細に説明し、それを修正する方法のアイデアを提供します。
ケンホワイト

@KenWhite、同意する、私はただOPが彼の質問をより明確にすることができると主張していただけなのか?一部の人々は、単に答えを与えるのではなく、方向を示すことだけを望んでいます。
Ash Burlaczenko 2012年

1
@paisleeの+1-JavaScriptにはcharのようなものがないため、この回答は役に立ちません。
simpleigh 2012年

2

常にyourStringの4番目の文字である場合、次のことを試すことができます。

yourString.replace(/^(.{4})(r)/, function($1, $2) { return $2; });

2

別のキャラクターに置き換えた場合にのみ機能します。単に削除するだけではありません。

これは、charがと等しい場合""char.length0であるため、部分文字列が結合されて元の文字列が形成されるためです。あなたのコードの試みと一緒に行くと、以下が機能します:

String.prototype.replaceAt = function (index, char) {
    return this.substr(0, index) + char + this.substr(index + 1);
    //   this will 'replace' the character at index with char ^
}

2

以下のような関数を作成します

  String.prototype.replaceAt = function (index, char) {
      if(char=='') {
          return this.slice(0,index)+this.substr(index+1 + char.length);
      } else {
          return this.substr(0, index) + char + this.substr(index + char.length);
      }
  }

以下のようなキャラクターを差し替える

  var a="12346";
  a.replaceAt(4,'5');

ここに画像の説明を入力してください

明確なインデックスの文字を削除するには、2番目のパラメーターを空の文字列として指定します

a.replaceAt(4,'');

ここに画像の説明を入力してください


2

単一の文字を削除するだけで、削除する文字のインデックスがわかっている場合は、次の関数を使用できます。

/**
 * Remove single character at particular index from string
 * @param {*} index index of character you want to remove
 * @param {*} str string from which character should be removed
 */
function removeCharAtIndex(index, str) {
    var maxIndex=index==0?0:index;
    return str.substring(0, maxIndex) + str.substring(index, str.length)
}

これは場合によっては機能しません(たとえば、インデックス= 0)。
トーマー、

1

文字列から文字を削除するための置換機能の使用が嫌いです。これは、そのようにすることは論理的ではありません。通常はC#(シャープ)でプログラミングします。文字列から文字を削除するときはいつでも、StringクラスのRemoveメソッドを使用しますが、Replaceメソッドは存在しますが、使用しません。置き換えなし。これは論理的です!

JavaScriptには、文字列の削除機能はありませんが、substr関数はあります。文字列から文字を削除するには、substr関数を1回または2回使用できます。次の関数を作成して、c#メソッドが最初にString.Remove(int startIndex)をオーバーロードするように、開始インデックスから文字列の末尾までの文字を削除できます。

function Remove(str, startIndex) {
    return str.substr(0, startIndex);
}

または、c#メソッドの2番目のオーバーロードString.Remove(int startIndex、int count)と同じように、次の関数で開始インデックスとカウントの文字を削除することもできます。

function Remove(str, startIndex, count) {
    return str.substr(0, startIndex) + str.substr(startIndex + count);
}

そして、あなたはあなたのニーズのためにこれらの2つの機能またはそれらの1つを使用することができます!

例:

alert(Remove("crt/r2002_2", 4, 1));

出力:crt / 2002_2

ロジックを使用せずに手法を実行して目標を達成すると、大規模なプロジェクトで多くのことを行うと、コードの理解が混乱し、将来の間違いが発生する可能性があります。


2
無関係なメソッドを導入することString.prototype.replaceは、ベースAPIの一部であるを使用することよりもはるかに混乱します。さらに、削除が交換の特殊なケースであると理解することは、プログラミングに関してはかなり論理的です。APIを英語の辞書にあるすべての単語で構成するのではなく、APIを最小限の直交ベースに削減する必要があります。
Witiko、2015年

1

次の関数は私の場合に最もよく機能しました:

public static cut(value: string, cutStart: number, cutEnd: number): string {
    return value.substring(0, cutStart) + value.substring(cutEnd + 1, value.length);
}

1

最短の方法はスプライスを使用することです

var inputString = "abc";
// convert to array and remove 1 element at position 4 and save directly to the array itself
let result = inputString.split("").splice(3, 1).join();
console.log(result);

Spliceは元の配列を変更し、影響を受けた要素のみを返します。配列にはインデックスが付けられていないため、この例では ""が返されます(配列の3番目の要素はcとの間の空白であるため"
JKirchartz

1

あなたはこれを使うことができます: if ( str[4] === 'r' ) str = str.slice(0, 4) + str.slice(5)

説明:

  1. if ( str[4] === 'r' )
    5番目の文字が 'r'

  2. str.slice(0, 4)
    文字列をスライスして、 'r'

  3. + str.slice(5)
    文字列の残りを追加します。

縮小: s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37バイト!]

デモ:

function remove5thR (s) {
  s=s[4]=='r'?s.slice(0,4)+s.slice(5):s;
  console.log(s); // log output
}

remove5thR('crt/r2002_2')  // > 'crt/2002_2'
remove5thR('crt|r2002_2')  // > 'crt|2002_2'
remove5thR('rrrrr')        // > 'rrrr'
remove5thR('RRRRR')        // > 'RRRRR' (no change)


1
let str = '1234567';
let index = 3;
str = str.substring(0, index) + str.substring(index + 1);
console.log(str) // 123567 - number "4" under index "3" is removed


-1

C#(シャープ)では、空の文字を '\ 0'にすることができます。たぶんこれを行うことができます:

String.prototype.replaceAt = function (index, char) {
return this.substr(0, index) + char + this.substr(index + char.length);
}
mystring.replaceAt(4, '\0')

グーグルで検索するか、インターネットでサーフィンし、C#のようにJavaScriptで空の文字を作成できるかどうかを確認します。もしそうなら、それを行う方法を学び、そしておそらくreplaceAt関数がついに機能し、あなたはあなたが望むものを達成するでしょう!

最後に、その「r」文字は削除されます!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.