2012-05-23 20 views
2

我將成千上萬的文檔從一種標記格式(顯然是RUNOFF的一些後代,對此我有最少的文檔)轉換成我可以提供給LaTeX的東西。該過程的一部分涉及在每個文檔中搜索每個具有特殊含義的字符串,並將其替換爲LaTeX的適當字符串。有數百個這樣的。到目前爲止,我的兩個想法是將每個做爲一個單獨的gsub或者用正則表達式構造一個gsub,它將匹配(通過ORing)許多符號,然後將匹配傳遞給具有大的case語句的方法退回適當的替代品。表面上看,第二種方式減少了每個文檔必須被掃描的次數,但是正則表達式中OR的開銷可能會更加昂貴。有沒有人知道哪種方法更好,或者我錯過了一個好方法?做許多不同的gsub操作的最快方法?

下面是我描述的兩種方式的例子。他們可能不完美。只是想明白我的觀點。

方法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 
+2

爲什麼不在兩個文件上進行基準測試並查看哪個更快? –

+0

是的,這是最好的建議。 Sooo ...我在我的兩種方法和Mori's上做了基準測試,結果發現它們的速度幾乎相同。這實際上有點令人驚訝。我多次嘗試使用多個示例輸入來確保。 所以,這只是一個最容易閱讀和維護的問題... – Huliax

回答

8

哇,這是一個很大的文件。但我認爲如果我這樣做,我不會擔心該計劃的效率。電腦速度快,價格便宜,不用擔心整夜都在運行。

其實,我不認爲我會在一般情況下打開代碼(連線到程序中)正則表達式。我想我會將替換放入一個平面或YAML文件,並且只在程序中構建需要狀態的那些表達式或特徵。

所以,如果我需要記住一個令牌,我可能會在表達式中創建表達式,或者將其標記在一個充滿轉碼錶達式的YAML文件中......我會擔心大多數關於我的程序結構如何以及如何很好的問題。我會盡量減少我的時間擺弄它並運行測試,至少在一開始就不擔心它的運行速度。

特別是,這個程序一旦完成,每個文件只運行一次。所以它不是一個很好的候選人,可以進行仔​​細的速度優化。此外,由於它運行一次,你必須永遠依靠它的決定,我認爲你的重點應該是保真度而不是速度。

+0

通常我會同意,但在這種情況下,速度是一個考慮因素。解釋爲什麼會需要比這裏允許的更多的空間(雖然我不介意解釋)。還要注意,爲了使翻譯正確發生,必須訂購替代品(或至少它們的組羣)。因爲我缺乏輸入格式的完整規範,所以我不得不推斷需要做什麼。這意味着翻譯步驟的順序可能隨着新需求被「發現」而改變。這是一項挑戰和PITA。欣賞這些建議......我是一名開發人員,每個角度都能幫助我。 – Huliax

+1

祝你好運!順便說一句,如果你發佈了一些原始標記,我相信我們可以確定格式。 – DigitalRoss

6
{ /a<-"/ => '\\"{a}', 
    ... 
}.each { |find, replace| output.gsub! find, replace } 
0

這些都是相同的一般格式嗎?然後,你可以簡單地

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

...假設Ruby有反向引用在\1\2等(對不起,不太熟悉的語言)。

+0

他們並不都是相同的一般格式。大幅面......但更大的幅面卻不是。 – Huliax