2

我正在将数以万计的文档从一种标记格式(显然是 RUNOFF 的一些后代,我有最少的文档)转换成我可以提供给 LaTeX 的东西。此过程的一部分涉及在每个文档中搜索在旧标记格式中具有特殊含义的每个字符串,并将其替换为适合 LaTeX 的字符串。有数百个。到目前为止,我的两个想法是将每个都作为单独的 gsub 或使用将匹配(通过 ORing)许多符号的正则表达式制作 gsub,然后将匹配传递给带有大 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
4

3 回答 3

8

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

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

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

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

于 2012-05-23T17:27:16.517 回答
6
{ /a<-"/ => '\\"{a}', 
  ... 
}.each { |find, replace| output.gsub! find, replace }
于 2012-05-23T17:30:35.027 回答
0

这些都是相同的通用格式吗?然后你可以简单地

output.gsub!(/([aeiouy])<-(["~^])/, '\\\2{\1}')

...假设 Ruby 在 等中有反向引用\1\2对不起,对语言不太熟悉)。

于 2012-05-23T17:32:23.600 回答