我正在尝试编写一个函数来计算两个字符串表示相同内容的可能性。为了做到这一点,我转换为小写并从字符串中删除特殊字符,然后我进行比较。目前,我正在使用String.replace(substring, '')
和使用String.replace(regex, '')
str = str.toLowerCase()
.replace('.com', '')
.replace('the', '')
.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');
有没有更好的正则表达式,我可以用来删除常见的模式,如'.com'和'the'以及特殊字符?或者其他一些方法可以提高效率?
随着我的数据集的增长,我可能会发现在尝试匹配字符串之前需要删除其他常见的无意义模式,并希望避免链接更多replace
函数的性能损失。
示例:
Fish&amp; Chips吗? =&GT;鱼片
stackoverflow.com =&gt;计算器
指环王=&gt;戒指之王
答案 0 :(得分:3)
您可以使用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
数组中和最后一位),也是如此"
(因为我使用"
作为字符串引号)。
答案 1 :(得分:0)
这个问题的问题在于,我确信你脑子里有一个非常具体的想法,你想要做什么,但是你得到的解决方案(在进行相同的比较之前删除无信息的信件)可能不是你想做的比较最好的。
我认为或许更好的想法是使用不同的方法比较和不同的数据结构而不是字符串。一个非常简单的示例是将字符串压缩为set('string')
的集合,然后比较集合相似度/差异。另一种方法可能是创建有向无环图或子串Trei。重点是,可以减少原始字符串中的信息并存储/比较 - 但是不要低估存储原始字符串的价值,因为它可以帮助您顺利完成你想改变比较的方式。
最后,如果你的字符串真的非常长,你可能想要使用感知哈希 - 这就像MD5哈希,除了类似的字符串有类似的哈希。但是,您很可能不得不为短字符串滚动自己,并定义您认为重要的数据,以及什么是多余的。