我有幾千個xml文件是從TTX格式的翻譯準備的java屬性文件生成的。它們包含了很多變數,我需要保護翻譯人員,因爲他們經常破壞這些東西。變量的形式是數字或偶爾在一對花括號之間的文本,例如。 {0},{this}。如何在xml元素中包含文本模式,除非它已經在某個xml元素中?
我需要圍繞這些變量與XML元素,如果它們還沒有一個屬性,如果他們還不是UT元素的內部文本的一部分,就像這樣:
<ut DisplayText="{0}"><{0}></ut>
我輸入如下所示:
<ut Type="start"DisplayText="string"><string></ut> text string {0}
<ut DisplayText="{1}"><{1}></ut> in:
<ut DisplayText="\n"><\n/></ut> {2}.
<ut Type="end" DisplayText="resource"></resource></ut>
正確的輸出應該是這樣的:
<ut Type="start"DisplayText="string"><string></ut> text string <ut DisplayText="{0}">{0}</ut>
<ut DisplayText="{1}"><{1}></ut> in:
<ut DisplayText="\n"><\n/></ut> <ut DisplayText="{2}">{2}</ut>.
<ut Type="end" DisplayText="resource"></resource></ut>
我最初的方法是使用正則表達式來匹配大括號中的術語,並使用模式替換在其周圍構建xml元素。如果在上面的第一個代碼塊中發現該模式,則此方法失敗。
上查找和替換patters(在記事本+ +):
查找
({[A-Za-z0-9]*})
更換
<ut DisplayText="\1">\1</ut>
它開始看起來像正則表達式是不是爲工作的工具,所以我想就更好的方法採取一些建議,使用不同的工具,甚至只是一個更完整的正則表達式,這可能會讓我快速而可重複地解決這個問題。
更新:問題證明是比以前想象的更復雜一點。似乎還有一些需要保護的東西,涉及一些比較模糊的語法,將變量與文本混合在一起,看起來似乎是某種條件語句。從內存:
{o,choice|1#1 error|1<{0,number,integer} errors}
其中「錯誤」和「錯誤」是可翻譯的,不應受到保護。我們目前最簡單的解決方案是運行上述正則表達式,修復它創建的奇數個錯誤,然後運行一些更復雜的項目替換通道。它可以被抽象爲正則表達式,但現在沒有太多的意義。
除了提供的改進表達式之外,我非常欣賞指向xslt和其他編輯器的更好的正則表達式支持。在時間允許的情況下,我會玩一些選項。
我沒有測試這一點,所以我把它在評論---如果數據格式是統一的,爲什麼不使用一個超前/回顧後?事情是這樣的:(?!<(= 「))({[A-ZA-Z0-9] *})(?!」) – Salty 2009-07-21 16:22:57
你可以用正則表達式做到這一點,但不是記事本+ +正則表達式,顯然。他們錯過了幾個重要的功能,包括lookarounds。你有可能使用別的東西嗎? EditPad Pro的正則表達式支持是一流的。 – 2009-07-21 18:53:21