ChatGPT解决这个技术问题 Extra ChatGPT

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

我很接近得到这个,但它是不正确的。我想做的就是从字符串中删除字符 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”-s 都被删除了,不是吗?
不,第一个不是

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

将使用 String.prototype.replace/r 替换为 /

或者,您可以使用带有全局标志的正则表达式(如下面的 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);
S
Strife86

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

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

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


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

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

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

这在删除第一个或最后一个字符时不起作用
@TekTimmy 为什么不呢? str.slice(0, 0) + str.slice(1, str.length) 删除第一个,str.slice(0, str.length-1) + str.slice(str.length, str.length) 删除最后一个。 (当然,如果你知道你总是删除第一个或最后一个,你会删除多余的部分,但如果它们是变量,它们的工作方式与任何其他索引一样好。)
最后有一个额外的 )
n
neophyte

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

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

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

现在过度解释:

在读/写正则表达式模式时,请考虑: 后跟 后跟 <...

在正则表达式 可能一次一个:

/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]+/

正则表达式开始看起来很古怪,但它都分解为一系列事物(可能是多字符事物),它们依次相互跟随。有点基本的一点,但我花了一段时间才过去,所以我在这里过度解释它,因为我认为它可以帮助 OP 和其他新的 regEx 了解正在发生的事情。读/写正则表达式的关键是将其分解为这些部分。


K
Ken White

只需修复您的 replaceAt

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

mystring.replaceAt(4, 1);

我将其称为 removeAt。 :)


这实际上解决了 OP 的问题并且几乎没有得到任何赞成票,而两个最佳答案并没有解决原始问题!
S
Sagar Gala

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

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

P
Penny Liu

这是 simpleigh answer 的改进(省略长度)

s.slice(0, 4) + s.slice(5)

让 s = "crt/r2002_2";让 o = s.slice(0, 4) + s.slice(5);让 delAtIdx = (s, i) => s.slice(0, i) + s.slice(i + 1); // 此函数删除索引 i 处的字母 console.log(o); console.log(delAtIdx(s, 4));


这是与 .substring(start,end) 配对以获取子字符串然后删除子字符串时最直接的方法。
S
Stefan van den Akker
return this.substr(0, index) + char + this.substr(index + char.length);

char.length 为零。在这种情况下,您需要添加 1 才能跳过字符。


这并没有回答所提出的问题;它只是解释了为什么 replaceAt 不起作用。它应该是对原始问题的评论,而不是答案。 :)
@KenWhite,事实上它确实回答了唯一的问题,Any thoughts?
很公平。我不同意,但是...... :) 我没有投反对票,但我不认为它有资格作为答案。答案将提供问题的解决方案,或者至少更详细地解释并提供如何解决问题的想法。
@KenWhite,我同意,我只是在指出 OP 可以让他的问题更清楚吗?有些人只想指出一个方向,而不是给出答案。
为@paislee +1 - 这个答案没有帮助,因为 JavaScript 中没有 char 之类的东西。
P
Penny Liu

让 str = '1234567';让索引 = 3; str = str.substring(0, index) + str.substring(index + 1); console.log(str) // 123567 - 索引“3”下的数字“4”被删除


M
Matt S

也许我是个菜鸟,但我今天遇到了这些,它们看起来都不必要地复杂。

这是一种更简单的(对我而言)从字符串中删除所需内容的方法。

function removeForbiddenCharacters(input) {
let forbiddenChars = ['/', '?', '&','=','.','"']

for (let char of forbiddenChars){
    input = input.split(char).join('');
}
return input

}


虽然您可能认为此解决方案更简单,而其他解决方案“不必要地复杂”,但由于重复的字符串拆分和连接(这将导致过多的新字符串分配和复制),此解决方案的运行时性能很差。我将您的解决方案与此基准 ( jsben.ch/AAGDc ) 中的单个 .replaceAll 调用进行了比较,replaceAll 的速度提高了 96%。
a
ata

创建如下函数

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

https://i.stack.imgur.com/IjITb.png

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

a.replaceAt(4,'');

https://i.stack.imgur.com/oTO1d.png


J
Just_Mad

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

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

c
calebds

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

这是因为当 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 ^
}

演示


j
jak.b

你可以使用这个:if ( str[4] === 'r' ) str = str.slice(0, 4) + str.slice(5)

解释:

if ( str[4] === 'r' ) 检查第 5 个字符是否是 'r' str.slice(0, 4) 对字符串进行切片以获取 'r' 之前的所有内容 + str.slice(5) 添加字符串的其余部分。

缩小: s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37 字节!]

演示:

函数 remove5thR (s) { s=s[4]=='r'?s.slice(0,4)+s.slice(5):s;控制台.log(s); // 日志输出 } remove5thR('crt/r2002_2') // > 'crt/2002_2' remove5thR('crt|r2002_2') // > 'crt|2002_2' remove5thR('rrrr') // > 'rrrr' remove5thR ('RRRRR') // > 'RRRRR' (没有变化)


d
dd619

如果您只想删除单个字符并且如果您知道要删除的字符的索引,则可以使用以下功能:

/**
 * 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)
}

佚名

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

在 Javascript 中,没有字符串的删除函数,但有 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

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


我想说的是,与仅使用 String.prototype.replace(它是基本 API 的一部分)相比,引入无关方法更加令人困惑。此外,就编程而言,将删除理解为替换的特殊情况是相当合乎逻辑的。你不应该试图让你的 API 包含英语词典中的所有单词,你应该尝试将你的 API 减少到它的最小正交基础。
T
TekTimmy

以下功能最适合我的情况:

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

G
Gabrielus

最短的方法是使用拼接

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 改变原始数组并仅返回受影响的元素。由于数组是零索引的,所以这个例子将返回 ""(因为数组中的第三个元素是 c" 之间的空白)
B
Babar-Baig

这个问题有很多应用。调整 @simpleigh 解决方案以使其更易于复制/粘贴:

function removeAt( str1, idx) {
  return str1.substr(0, idx) + str1.substr(idx+1)
}
console.log(removeAt('abbcdef', 1))  // prints: abcdef

G
Gass

所以基本上,另一种方法是:

使用 Array.from() 方法将字符串转换为数组。遍历数组并删除所有 r 个字母,除了索引为 1 的字母。将数组转换回字符串。

让 arr = Array.from("crt/r2002_2"); arr.forEach((letter, i) => { if(letter === 'r' && i !== 1) arr[i] = "" }); document.write(arr.join(""));


D
Daniel

使用 [index] 位置删除特定字符

String.prototype.remplaceAt = function (index, distance) {
  return this.slice(0, index) + this.slice(index + distance, this.length);
};

归功于 https://stackoverflow.com/users/62576/ken-white


佚名

在 C# (Sharp) 中,您可以将空字符设为 '\0'。也许你可以这样做:

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

在谷歌上搜索或在互联网上冲浪并检查 javascript 是否允许您制作空字符,就像 C# 一样。如果是,那么学习如何去做,也许 replaceAt 函数最终会起作用,你会实现你想要的!

最后那个'r'字符将被删除!


OP 需要 JavaScript 解决方案,而不是来自另一种可能在 JS 中工作或不工作的语言的想法