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

IT技术 javascript string replace character
2021-01-25 17:14:14

我很接近得到这个,但它只是不对。我想要做的就是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, '')

只有当我用另一个字符替换它时才有效。它不会简单地删除它。

有什么想法吗?

6个回答
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工作方式,请不要从第 3 行的索引中减去 1 并使用tmp.splice(i, 1)

此功能只需一次更正即可完美运行。我改变了 tmp.splice(i - 1 , 1); 到 tmp.splice(i, 1);
2021-04-08 17:14:14
第四个字符不一定是 "/"
2021-04-10 17:14:14

一个简单的功能 javascript 方式是

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

简单,快速,全局替换,无需函数或原型

第四个字符不一定是 '/'
2021-03-18 17:14:14
我认为这是最好的解决方案,非常简单,您不需要了解正则表达式!
2021-04-08 17:14:14
无论如何,根据测试(stackoverflow.com/questions/50463850/...),除非您正在编写高性能(每秒 10k 次操作)javascript,否则性能差异不是问题或“付出的代价高昂”,所以我不明白您的评论有多准确为解决方案做出贡献
2021-04-08 17:14:14
这对我很有效。当我尝试 mystring = mystring.replace('/r','/'); 它只转换第一个校正器,其余的按原样转换。
2021-04-10 17:14:14
除了效率低下(并且像这样的函数可以在重要的长列表上迭代使用)之外,这并不能回答 OP 的问题,该问题取决于索引,而不是取决于前面的字符。
2021-04-10 17:14:14

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

str.slice(0, 4) + str.slice(5, str.length))
这在删除第一个或最后一个字符时不起作用
2021-03-21 17:14:14
@TekTimmy 为什么不呢?str.slice(0, 0) + str.slice(1, str.length)删除第一个并str.slice(0, str.length-1) + str.slice(str.length, str.length)删除最后一个。(当然,如果你知道你总是删除第一个或最后一个,你会删除多余的部分,但如果它们是变量,它们就像任何其他索引一样工作。)
2021-03-21 17:14:14
最后还有一个)
2021-04-11 17:14:14

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

编辑:之前没有看到它是第二个 'r',所以添加了 '/'。使用 regEx arg 时需要 \/ 来转义“/”。感谢您的投票,但我错了,所以我会修复并为有兴趣更好地理解 regEx 基础知识的人添加更多细节,但这会起作用:

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

现在为过度解释:

当读/写正则表达式模式时,请考虑:<一个字符或一组字符> 后跟 <一个字符或一组字符> 后跟 <...

在正则表达式中,<一个字符或一组字符> 可以是一个:

/each char in this pattern/

所以读为e,然后是a,然后是c,等等......

或者单个 <a character or set of charcters> 可以是字符类描述的字符:

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

对于'/r'的全局替换,这段代码对我有用。

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