Ruby 以最快的方式完成许多不同的gsub操作?

Ruby 以最快的方式完成许多不同的gsub操作?,ruby,regex,gsub,Ruby,Regex,Gsub,我正在将数以万计的文档从一种标记格式(显然是径流的后代,我只有很少的文档)转换为可以提供给LaTeX的内容。此过程的一部分涉及在每个文档中搜索在旧标记格式中具有特殊含义的字符串,并将其替换为LaTeX的适当字符串。有数百种。到目前为止,我的两个想法是将每一个都作为一个单独的gsub来做,或者用一个正则表达式来生成一个gsub,该正则表达式将匹配(通过ORing)许多符号,然后用一个大号语句将匹配传递给方法,该语句将传回相应的替换。从表面上看,第二种方法减少了每个文档必须扫描的次数,但正则表达式中

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

下面是我描述的两种方法的示例。它们可能不完美。只是想让大家明白我的意思

方法1:

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

output.gsub!(/a哇,文件太多了。但我想如果我这样做的话,我不会担心程序的效率有多高。计算机又快又便宜,而且不介意通宵运行

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

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


特别是,这个程序一旦完成,每个文档只运行一次。因此,它并不是仔细优化速度的好选择。此外,由于它只运行一次,您必须永远遵守它的决定,我认为您的重点应该是忠实度,而不是速度。

{/a这些都是相同的通用格式吗?那么你可以简单地

{ /a<-"/ => '\\"{a}', 
  ... 
}.each { |find, replace| output.gsub! find, replace }
output.gsub!(/([aeiouy])<-(["~^])/, '\\\2{\1}')

output.gsub!(/([aeiouy])为什么不在几个文件上都进行基准测试,看看哪个更快?是的,这是最好的建议。Sooo…我在我的方法和Mori的方法上都进行了基准测试,结果发现它们在速度上几乎相同。这实际上有点令人惊讶。我使用多个样本输入多次尝试,只是为了确定。所以,这只是一个哑光其中的r最容易阅读和维护…它们并非都是相同的通用格式。大的线束是…但更大的线束不是。通常我会同意,但在这种情况下,速度是一个考虑因素。解释为什么会占用比此处允许的更多的空间(尽管我不介意解释)。还请注意,替换为了正确进行翻译,必须对(或至少一组)进行排序。因为我缺乏输入格式的完整规范,我必须推断需要做什么。这意味着翻译步骤的排序可能会随着“发现”新需求而改变这是一个挑战和一个PITA。感谢你的建议…我是jr开发人员,每个角度都有助于我的头脑。祝你好运!顺便说一句,如果你发布了一些原始标记,我相信我们可以确定格式。
output.gsub!(/([aeiouy])<-(["~^])/, '\\\2{\1}')