我就快拿到了,但就是不太对。 我想做的就是从字符串中删除字符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, '')

只有当我用另一个字符替换它时,它才会工作。它不会简单地移除它。

任何想法吗?


当前回答

你可以这样使用: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个字节!] 演示:

function remove5thR (s) s = s[4] =‘r’? s。切片(0.4)+ s。切片(5):s; 控制台日志(s);//输出日志 的 移除5thr ('crt/r2002_2') // > 'crt/2002_2' remove5thR(“crt | r2002_2 ') // > ' crt | 2002_2” 删除5thr(“rrrrr”)// >“rrrr” 删除5thr(“RRRRR”)// >“RRRRR”(不改变)

其他回答

一个简单的函数式javascript方法是

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

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

最短的方法是使用拼接

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

你的第一个玩笑几乎是对的。只需要删除代表“global”(编辑)的“g”标志,并给它一些上下文来发现第二个“r”。

编辑:没有看到前面是第二个“r”,所以加上了“/”。当使用正则表达式参数时,需要\/转义'/'。谢谢你的点赞,但我错了,所以我将修复和添加更多细节,让有兴趣更好地理解regEx基础知识的人,但这是可行的:

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

现在是过度的解释:

当读取/写入一个正则表达式模式时,可以这样思考:<一个字符或一组字符>后面跟着<一个字符或一组字符>后面跟着<…

在regEx <一个字符或一组字符时,>一次可以是一个:

/each char in this pattern/

所以读成e,接着是a,接着是c,等等……

或者单个<a字符或字符集>可以是由字符类描述的字符:

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

下面的函数最适合我的例子:

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

你可以这样使用: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个字节!] 演示:

function remove5thR (s) s = s[4] =‘r’? s。切片(0.4)+ s。切片(5):s; 控制台日志(s);//输出日志 的 移除5thr ('crt/r2002_2') // > 'crt/2002_2' remove5thR(“crt | r2002_2 ') // > ' crt | 2002_2” 删除5thr(“rrrrr”)// >“rrrr” 删除5thr(“RRRRR”)// >“RRRRR”(不改变)