【问题标题】:Efficiently remove common patterns from a string有效地从字符串中删除常见模式
【发布时间】:2016-03-22 11:40:10
【问题描述】:

我正在尝试编写一个函数来计算两个字符串表示同一事物的可能性。为了做到这一点,我将转换为小写并在比较字符串之前从字符串中删除特殊字符。目前我正在使用String.replace(substring, '') 删除字符串“.com”和“the”,使用String.replace(regex, '') 删除特殊字符

str = str.toLowerCase()
         .replace('.com', '')
         .replace('the', '')
         .replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 

是否有更好的正则表达式可以用来删除“.com”和“the”等常见模式以及特殊字符?或者其他一些方法可以提高效率?

随着数据集的增长,我可能会发现在尝试匹配字符串之前需要删除其他常见的无意义模式,并希望避免链接更多 replace 函数对性能造成的影响。

例子:

炸鱼薯条? => 鱼片

stackoverflow.com => 堆栈溢出

指环王 => 指环王

【问题讨论】:

  • 你能分享几个例子吗?
  • 为什么不将常见/无意义的模式存储在一个数组中,然后在替换之前将它们转换为字符集正则表达式模式,这样您就可以用空格替换与该模式的匹配项?
  • 您可以在字符串之间使用带有 OR 的正则表达式。
  • 喜欢:str.toLowerCase().replace('.com|the', '')

标签: javascript regex string-matching


【解决方案1】:

您可以使用这样的 rexexp 将替换调用连接到单个调用:

str = str.toLowerCase().replace(/\.com|the|[&\/\\#,+()$~%.'":*?<>{}]/g, '');

要删除的不同字符串在括号 () 内并用竖线分隔 |

这使得向正则表达式添加更多字符串变得很容易。

如果您将要删除的单词存储在数组中,您可以使用RegExp 构造函数生成正则表达式,例如:

var words = ["\\.com", "the"];
var rex = new RegExp(words.join("|") + "|[&\\/\\\\#,+()$~%.'\":*?<>{}]", "g");

然后对每个字符串重用 rex:

str = str.toLowerCase().replace(rex, "");

请注意额外的转义,因为我们使用的是字符串而不是正则表达式文字,因此需要转义反斜杠(在words 数组和最后一位中)," 也是如此(因为我使用" 作为字符串引号)。

【讨论】:

  • 好答案,但正如我在评论中所说,我会将字符串存储在一个数组中,因此不需要对基本替换模式进行任何更改。
  • @T.J.Crowder 这就是我的观点;无需在实际的替换方法调用中包含所有字符集。
  • @t-j-crowder,没错。编辑了捕获组。
  • @T.J.Crowder 这就是我对 OP 的建议,而 Orr 的回答并未包括在内。我是说使用这样的方法会更好。这有意义吗?
  • @JohnClifford:现在和你在一起。
【解决方案2】:

这个问题的问题在于,我确定您对自己想做的事情有一个非常具体的想法,但是您得出的解决方案(在进行相同比较之前删除不提供信息的字母)可能不是你想做的比较的最佳选择。

我认为也许更好的主意是使用与字符串不同的方法比较和数据结构。一个非常简单的示例是将您的字符串压缩为带有set('string') 的集合,然后比较集合的相似性/差异。另一种方法可能是创建有向无环图或子字符串 Trei。要点是减少原始字符串中的信息并存储/比较它可能是可以的 - 但是不要低估存储原始字符串的价值,因为如果您想改变方式,它将帮助您前进你比较。 最后,如果您的字符串真的很长,您可能想要使用感知散列 - 这就像 MD5 散列,除了相似的字符串具有相似的散列。但是,您很可能不得不为短字符串滚动自己的内容,并定义您认为重要的数据,以及多余的数据。

【讨论】:

  • 感谢您的建议,我会研究一下。在对它们进行这些更改之前,我将原始字符串存储在我的数据库中,因此如果我以后想更改我的方法,这不会有问题。
猜你喜欢
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2011-07-15
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多