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

我很接近得到这个,但它就是不对。 我所要做的就是从字符串中删除字符r。 问题是,字符串中有多个r实例。 但是,它总是在索引4处的字符(因此是第5个字符)

示例字符串: crt/r2002_2

我想要的是: crt/2002_2

这个replace函数删除了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, '')

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

任何想法吗?

1414490 次浏览
return this.substr(0, index) + char + this.substr(index + char.length);

char.length是零。在这种情况下,为了跳过字符,你需要添加1

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

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

或者你也可以使用带有全局标志的regex(如Erik Reppen &Sagar联欢晚会,下面)来替换所有出现的

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)

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

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

如果它总是在你的字符串中的第4个字符,你可以尝试:

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

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

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

只需修复你的replaceAt:

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


mystring.replaceAt(4, 1);

我把它命名为removeAt。:)

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

编辑:没有看到前面是第二个“r”,所以加上了“/”。当使用正则表达式参数时,需要\/转义'/'。谢谢你的点赞,但我错了,所以我将修复和添加更多细节,让有兴趣更好地理解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]+/

就像regEx开始看起来一样古怪,它都分解为一系列的东西(可能是多字符的东西)按顺序相互跟随。这是一个基本的观点,但我花了一段时间来理解它,所以我在这里过度解释它,因为我认为这将有助于OP和其他新regEx理解发生了什么。读取/写入regEx的关键是将其分解成这些部分。

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

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

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

在Javascript中,字符串没有remove函数,但是有substr函数。可以使用substr函数一次或两次从字符串中删除字符。您可以使用下面的函数删除字符串末尾的起始索引处的字符,就像c#方法首先重载string一样。删除(int startIndex):

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

和/或你也可以让下面的函数删除字符在开始索引和计数,就像c#方法第二次重载字符串。删除(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

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

在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#一样。如果是,那么学习如何做到这一点,也许replacat函数最终会工作,并且您将实现您想要的!

最后,'r'字符将被删除!

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

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

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

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

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

最短的方法是使用拼接

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

这是对simpleigh回答(省略length)的改进

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

let s = "crt/r2002_2";
let o = s.slice(0, 4) + s.slice(5);
let delAtIdx = (s, i) => s.slice(0, i) + s.slice(i + 1); // this function remove letter at index i


console.log(o);
console.log(delAtIdx(s, 4));

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

解释:

    <李> < p > if ( str[4] === 'r' ) < br > 检查第5个字符是否是'r'

    <李> < p > str.slice(0, 4) < br > 切片字符串以获取'r'

    之前的所有内容 <李> < p > + str.slice(5) < br >

缩小: s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37字节!] < br > < br > 演示:< / >强

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)

创建如下所示的函数

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

enter image description here

为了删除指定下标处的字符,给出第二个参数为空字符串

a.replaceAt(4,'');

enter image description here

如果你只想删除单个字符和 如果你知道你想要删除的字符的索引,你可以使用以下函数:

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

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

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

这里有一个更简单的方法(对我来说)从字符串中删除任何你想要的东西。

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


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

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

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

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

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

let arr = Array.from("crt/r2002_2");


arr.forEach((letter, i) => { if(letter === 'r' && i !== 1) arr[i] = "" });


document.write(arr.join(""));

使用[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的信用