ruby - 执行许多不同 gsub 操作的最快方法?

标签 ruby regex gsub

我正在将数以万计的文档从一种标记格式(显然是 RUNOFF 的一些后代,我的文档很少)转换成我可以提供给 LaTeX 的格式。此过程的一部分涉及在每个文档中搜索在旧标记格式中具有特殊含义的每个字符串,并将其替换为适合 LaTeX 的字符串。有数百个。到目前为止,我的两个想法是将每个作为一个单独的 gsub 来做,或者用一个正则表达式来制作一个 gsub,该正则表达式将匹配(通过 ORing)许多符号,然后将匹配传递给带有将传递的大 case 语句的方法返回适当的替换。从表面上看,第二种方法减少了必须扫描每个文档的次数,但正则表达式中 OR 的开销可能更昂贵。有没有人知道哪种方法更好,或者我是否错过了一个好的方法?

以下是我所描述的两种方式的示例。它们可能不完美。只是想表达我的观点。

方法一:

output.gsub!(/a<-"/, '\\"{a}') # ä
output.gsub!(/a<-^/, '\\^{a}') # â
output.gsub!(/a<-~/, '\\~{a}') # ã
...etc

方法二:

output.gsub!(/a<-"|a<-^|a<-~|etc/) {|match| convert_symbol(match)}

def convert_symbol(input)
  case match
  when 'a<-"'
    '\\"{a}' # ä
  when "a<-^"
    '\\^{a}' # â
  when "a<-~"
    '\\~{a}' # ã
  when 'etc'
    '\\LaTeX...etc'
  end
end

最佳答案

哇,这么多文件。但我认为如果我这样做,我就不会担心程序的效率如何。电脑又快又便宜,不介意整夜运行。

实际上,我不认为在一般情况下我会打开代码(连接到程序中)正则表达式。我想我会将替换放入一个平面文件或 YAML 文件中,并且只将那些需要状态的表达式或功能构建到程序中。

因此,如果我需要记住一个标记,我可能会在其中构建表达式,或者可能会在充满转码表达式的 YAML 文件中标记它……我最担心的是我的程序的结构有多好。我会尽量减少摆弄它和运行测试的时间,并且至少在开始时不会担心它的运行速度。

特别是,这个程序一旦完成,每个文档只运行一次。所以它并不是仔细优化速度的好选择。此外,由于它运行一次并且您必须永远接受它的决定,我认为您的重点应该放在保真度而不是速度上。

关于ruby - 执行许多不同 gsub 操作的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10724738/

相关文章:

ruby-on-rails - 如何使用 rbhive gem 和查询 hive

python - 将 C# 正则表达式转换为 python

ruby - 使用分组时如何使用 gsub 在 Ruby 正则表达式 (regex) 中反向引用?

ruby - 在 ruby​​ 字符串中正确使用 gsub

regex - 在R中正确使用gsub/正则表达式?

ruby-on-rails - Rails 5 has_secure_token 加密

ruby - xpath 搜索极慢(ruby/nokogiri)

javascript - 如何使用正则表达式在 javascript 中通过 id 获取元素?

ruby - 我应该将属于 Ruby 标准库的文件添加到 `Gemfile` 吗?

regex - 如何使用 sed/perl 仅查找二维数组并替换文本?