2

私は何万ものドキュメントを 1 つのマークアップ形式 (どうやら RUNOFF の子孫で、ドキュメントが最小限しかない) から LaTeX にフィードできるものに変換しています。このプロセスの一部には、古いマークアップ形式で特別な意味を持つ各文字列を各ドキュメントで検索し、LaTeX の適切な文字列に置き換えることが含まれます。これらは何百もあります。これまでの私の 2 つの考えは、それぞれを個別の gsub として実行するか、(ORing によって) 多くのシンボルに一致する正規表現を使用して gsub を作成し、合格する大きな case ステートメントを使用して一致をメソッドに渡すことです。適切な置換を戻します。一見すると、2 番目の方法は各ドキュメントをスキャンする必要がある回数を減らしますが、正規表現内の OR のオーバーヘッドはよりコストがかかる可能性があります。

ここでは、私が説明した 2 つの方法の例を示します。それらは不完全かもしれません。私の主張を理解しようとしているだけです。

方法 1:

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

方法 2:

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ファイルでフラグを立てることができます...プログラムがどれだけうまく構造化されているかについて最も心配します。私はそれをいじってテストを実行する時間を最小限に抑えようとし、少なくとも最初は、実行速度について心配する必要はありません。

特に、このプログラムは、一度終了すると、ドキュメントごとに1回だけ実行されます。したがって、慎重な速度最適化の候補としてはあまり適していません。さらに、一度実行すると、その決定に永遠に耐えなければならないので、スピードではなく忠実度に焦点を当てるべきだと思います。

于 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}')

\1... Rubyに後方参照があると仮定します\2(申し訳ありませんが、言語にあまり精通していません)。

于 2012-05-23T17:32:23.600 に答える