【问题标题】:Remove string with characters from Javascript array从Javascript数组中删除带有字符的字符串
【发布时间】:2019-07-10 17:46:54
【问题描述】:

我正在尝试使用正则表达式构建查找和删除类型功能。我能够达到可以删除字符串的地步,但发现无法删除带有字符的字符串。当使用诸如var word = "is" 之类的普通字符串时,它似乎工作正常,直到遇到.,然后我得到奇怪的不需要的输出。

例如,在将字符合并到我要删除的字符串中时,还会出现一些其他不需要的情况(请注意下面代码中的 var word = "is." 而不是 is

var myarray = ["Dr. this is", "this is. iss", "Is this IS"]
var my2array = []
var word = "is."

//var regex = new RegExp(`\\b${word}\\b`, 'gi');
var regex = new RegExp('\\b' + word + '\\b', 'gi');

for (const i of myarray) {
    var x = i.replace(regex, "")
    my2array.push(x)
}
myarray = my2array
console.log(myarray)

["Dr. this is", "this is. ", "this IS"]

这个 ^ 在几个方面是错误的(由于某种原因,iss 消失了,is. 仍然存在 - 这是我试图删除的主要字符串,最后一个索引中的第一个 is 消失了...... )

I.E.在这种情况下,我想要的输出是["Dr. this is", "this iss", "Is this IS"]

我也尝试过使用模板文字,从我注释掉的代码中可以看出。

目标是简单地从我的数组中删除 var word 中可能存在的任何值。该值是常规字符串、带有字符的字符串还是只是字符。 (当然在我的休息范围内)。

【问题讨论】:

  • . 匹配正则表达式中的任何字符,它也不是单词字符。您可以将其转义为\.(即"is\\.")以使其匹配文字句点,但单词边界仍将位于它之前,而不是之后。
  • 注意XY问题现象。你不应该断言一个可能的解决方案,必然会降低你获得最佳结果的机会。以阿努巴瓦的回答为例。
  • 与问题无关,但您也可以使用 .map 而不是 for+push。 myarray = myarray.map(str => str.replace(regex, ''));
  • 您需要对字符串word中的正则表达式特殊字符进行转义。请参阅:MDN Regular Expressions - EscapingEscape string for use in Javascript regex

标签: javascript arrays regex


【解决方案1】:

正则表达式方法存在一些问题:

  1. . 是特殊的正则表达式字符,需要在您的单词中进行转义
  2. 字边界\b.之后将不匹配

您可以使用这个基于正则表达式的解决方案:

var myarray = ["Dr. this is", "this is. iss", "Is this IS"]
var my2array = []

var word = "is."

// using lookahead and lookbehind instead of word boundary   
var regex = new RegExp('\\s*(?<!\\S)' +
          word.replace(/\W/g, "\\$&") + '(?!\\S)\\s*')

for (const i of myarray) {
    var x = i.replace(regex, " ")
    my2array.push(x)
}

myarray = my2array
console.log(myarray)
  • .replace(/\W/g, "\\$&amp;") 将转义给定的所有非单词字符 字。
  • (?&lt;!\S) 是否定后向断言前一个字符不是非空格字符
  • (?!\S) 是否定后向断言下一个字符不是非空格字符

【讨论】:

  • 不幸的是,这不起作用。如果我更改我的var word = "is",它将摆脱this. 中的is
  • 是的,我知道并且我已经为此目的发布了一个正则表达式解决方案。
  • 谢谢,我即将接受这个答案,但我还有一个问题:即使\\. 没有在var word = "is\\." 中转义,这似乎也有效,例如var word = "is." .我计划让用户输入var word,所以如果我不需要更改var word 字符串以使其工作,它会为我省去麻烦。这会在以后给我带来问题,还是var word 中的转义是多余的?
  • 当你从用户那里得到类似is(的东西时需要转义,如果不转义会导致正则表达式引擎错误
  • 检查更新的答案,了解运行时转义正则表达式中的特殊字符。
猜你喜欢
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2016-01-01
  • 2013-03-02
相关资源
最近更新 更多