regex 在Ruby中搜索和替换字符串的最快方法是什么?

wgx48brx  于 2022-12-19  发布在  Ruby
关注(0)|答案(2)|浏览(132)

我正在构建一个库,它可以清理用户生成的内容,并且需要进行数千个字符串替换(性能是关键)。
在字符串中进行搜索和替换的最快的方法是什么?
下面是库将进行的替换的示例:

u2 => you too
2day => today
2moro => tomorrow
2morrow => tomorrow
2tomorow  => tomorrow

字符串的显示方式有四种情况:

  • 字符串中的起始单词(末尾有空格,但前面没有)2day sample
  • 字符串的中间(在字符串的前面和末尾各有一个空格)sample 2day sample
  • 字符串结尾(前面只有一个空格,但是最后一个单词)sample 2day
  • 整个字符串匹配2day

也就是说,如果正则表达式位于sample2daysample这样的单词中间,则不应替换它

ifmq2ha2

ifmq2ha21#

可能的解决方案:

replaces = {'u2' => 'you too', '2day' => 'today', '2moro' => 'tomorrow'}

str = '2day and 2moro are u2 sample2daysample'

#exp = Regexp.union(replaces.keys)  #it is the best but to use \b this should be a quiet different
exp = Regexp.new(replaces.keys.map { |x| "\\b" + Regexp.escape(x) + "\\b" }.join('|'))
str = str.gsub(exp, replaces)

# => "today and tomorrow are you too sample2daysample"
w6lpcovy

w6lpcovy2#

完全披露:我是这颗宝石的作者
如果你不需要正则表达式,你可以尝试https://github.com/jedld/multi_string_replace,它使用aho-corasick算法来实现这一点。

user     system      total        real
multi gsub           1.322510   0.000000   1.322510 (  1.344405)
MultiStringReplace   0.196823   0.007979   0.204802 (  0.207219)
mreplace             0.200593   0.004031   0.204624 (  0.205379)

我看到的唯一问题是算法不理解单词边界,因此您必须将用例分解为:
“2天“、“2天“、“2天”

相关问题