有效地从字符串中删除常见模式
Efficiently remove common patterns from a string
我正在尝试编写一个函数来计算两个字符串表示同一事物的可能性。为了做到这一点,我将转换为小写字母并在比较它们之前从字符串中删除特殊字符。目前我正在删除字符串 '.com' 和 'the' 使用 String.replace(substring, '')
和特殊字符使用 String.replace(regex, '')
str = str.toLowerCase()
.replace('.com', '')
.replace('the', '')
.replace(/[&\/\#,+()$~%.'":*?<>{}]/g, '');
是否有更好的正则表达式可用于删除“.com”和 'the' 等常见模式以及特殊字符?或者其他一些提高效率的方法?
随着我的数据集的增长,我可能会发现其他常见的无意义模式需要在尝试匹配字符串之前删除,并且希望避免链接更多 replace
函数的性能影响。
示例:
炸鱼薯条? =>炸鱼片
whosebug.com => 计算器
指环王 => 指环王
您可以使用这样的 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
数组和最后一位中),就像"
(因为我使用 "
作为字符串引号)。
这个问题的问题是,我确定你在脑海中对你想做什么有一个非常具体的想法,但是你得到的解决方案(在进行完全相同的比较之前删除没有信息的字母) 可能不是您要进行的比较的最佳选择。
我认为也许更好的主意是使用与字符串不同的方法比较和不同的数据结构。一个非常简单的示例是将字符串压缩为 set('string')
的集合,然后比较集合 similarity/difference。另一种方法可能是创建有向无环图或子字符串 Trei。要点是减少原始字符串中的信息可能没问题 store/compare - 但是不要低估存储原始字符串的价值,因为如果你想改变它会帮助你你比较的方式。
最后,如果您的字符串真的非常非常长,您可能想要使用感知散列——类似于 MD5 散列,除了相似的字符串具有相似的散列。但是,对于短字符串,您很可能必须自己动手,并定义您认为重要的数据,以及多余的数据。
我正在尝试编写一个函数来计算两个字符串表示同一事物的可能性。为了做到这一点,我将转换为小写字母并在比较它们之前从字符串中删除特殊字符。目前我正在删除字符串 '.com' 和 'the' 使用 String.replace(substring, '')
和特殊字符使用 String.replace(regex, '')
str = str.toLowerCase()
.replace('.com', '')
.replace('the', '')
.replace(/[&\/\#,+()$~%.'":*?<>{}]/g, '');
是否有更好的正则表达式可用于删除“.com”和 'the' 等常见模式以及特殊字符?或者其他一些提高效率的方法?
随着我的数据集的增长,我可能会发现其他常见的无意义模式需要在尝试匹配字符串之前删除,并且希望避免链接更多 replace
函数的性能影响。
示例:
炸鱼薯条? =>炸鱼片
whosebug.com => 计算器
指环王 => 指环王
您可以使用这样的 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
数组和最后一位中),就像"
(因为我使用 "
作为字符串引号)。
这个问题的问题是,我确定你在脑海中对你想做什么有一个非常具体的想法,但是你得到的解决方案(在进行完全相同的比较之前删除没有信息的字母) 可能不是您要进行的比较的最佳选择。
我认为也许更好的主意是使用与字符串不同的方法比较和不同的数据结构。一个非常简单的示例是将字符串压缩为 set('string')
的集合,然后比较集合 similarity/difference。另一种方法可能是创建有向无环图或子字符串 Trei。要点是减少原始字符串中的信息可能没问题 store/compare - 但是不要低估存储原始字符串的价值,因为如果你想改变它会帮助你你比较的方式。
最后,如果您的字符串真的非常非常长,您可能想要使用感知散列——类似于 MD5 散列,除了相似的字符串具有相似的散列。但是,对于短字符串,您很可能必须自己动手,并定义您认为重要的数据,以及多余的数据。