如何使用Javascript从字符串中删除字符?


361

我非常接近这个意思,但这是不对的。我要做的就是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

Answers:


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

将替换/r/using 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使用普通计数而不是零索引计数,因此我们必须从索引中删除1,如果您希望使用它来复制charAt工作原理,请不要在第三行的索引中减去1 tmp.splice(i, 1)


3
第四个字符不一定是"/"
jak.b

74

一种简单的功能性javascript方式是

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

简单,快速,可在全球范围内替换,无需功能或原型


3
这对我很有效。当我尝试mystring = mystring.replace('/ r','/'); 它仅转换第一个校正器,其余部分保持原样。
rb vishnu

1
我认为这是最好的解决方案,非常简单,您不需要了解正则表达式!
商业自杀

2
第四个字符不一定是'/'
jak.b

1
无论如何,根据测试(stackoverflow.com/questions/50463850/…),除非您写出了高性能(每秒10k次操作)javascript,性能差异不是问题或“高昂的代价”,所以我看不到您的评论如何有助于解决方案
Strife86 '19

除了效率低下(而且可能在长列表上迭代使用这样的函数)之外,这也无法回答OP的问题,后者取决于索引,而不取决于前一个字符。
aamarks

49

总是有字符串函数,如果您知道总是要删除第四个字符:

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

您的第一个功能几乎是正确的。只需删除代表“全局”(编辑)的“ g”标志,并为其提供一些上下文,以发现第二个“ r”。

编辑:在添加'/'之前没有看到它是第二个'r'。使用regEx arg时需要\ /来转义'/'。感谢您的支持,但我错了,所以我将为有兴趣更好地了解regEx基础知识的人们修复并添加更多详细信息,但这将有效:

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

现在进行过多的解释:

读/写regEx模式时,请考虑以下方面:<一个字符或一组字符>后跟<一个字符或一组字符>后跟<...

在regEx中,一个字符或一组字符一次可以是一个:

/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的关键是将其分解为这些部分。


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的问题,几乎得不到任何投票,而两个最重要的答案却不能解决原始问题!
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
+1代表@paislee-这个答案没有帮助,因为JavaScript中没有char这类东西。
simpleigh 2012年

2

如果它始终是yourString中的第四个字符,则可以尝试:

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

2

仅当我用另一个字符替换它时,它才起作用。它不会简单地将其删除。

这是因为when char等于""char.length为0,因此您的子字符串组合形成原始字符串。尝试进行代码时,将执行以下操作:

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');

在此处输入图片说明

并删除确定索引处的字符,将第二个参数指定为空字符串

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),此方法将无效。
Tomer

1

我不喜欢使用替换功能从字符串中删除字符。这样是不合逻辑的。通常,我使用C#(Sharp)进行编程,每当我想从字符串中删除字符时,我都会使用String类的Remove方法,但即使存在,也不会使用Replace方法,因为当我要删除时,我会删除,无可替代。这是合乎逻辑的!

在Javascript中,没有用于字符串的remove函数,但是有substr函数。您可以使用substr函数一次或两次从字符串中删除字符。您可以执行以下函数来删除字符串的开始索引处到字符串末尾的字符,就像c#方法的第一个重载String.Remove(int startIndex)一样:

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

和/或您还可以使以下函数删除起始索引和计数处的字符,就像c#方法第二次重载String.Remove(int startIndex,int count)一样:

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

然后您可以使用这两个功能或其中之一来满足您的需要!

例:

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

输出:crt / 2002_2

如果您在大型项目中经常这样做,那么通过不使用逻辑的技术来实现目标可能会导致对代码理解的困惑以及将来的错误!


2
我要说的是,引入无关的方法要比仅使用混乱得多String.prototype.replace,后者是基本API的一部分。而且,就编程而言,将删除理解为替换的一种特殊情况是很合逻辑的。您不应该尝试使API包含英语词典中的所有单词,而应尝试将API缩减为最小的正交基数。
Witiko

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);

拼接使原始数组变异,并仅返回受影响的元素。由于阵列是零索引,这个例子将返回“”(自阵列中的第三元素是之间的空白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#(Sharp)中,您可以将一个空字符设为'\ 0'。也许您可以这样做:

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

在Google或Interent上搜索,然后检查javascript是否允许您像C#一样使空字符。如果是,那么学习如何做,也许replaceAt函数最后将起作用,您将实现所需的功能!

最终,“ r”字符将被删除!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.