2009-07-21 37 views
0

我有幾千個xml文件是從TTX格式的翻譯準備的java屬性文件生成的。它們包含了很多變數,我需要保護翻譯人員,因爲他們經常破壞這些東西。變量的形式是數字或偶爾在一對花括號之間的文本,例如。 {0},{this}。如何在xml元素中包含文本模式,除非它已經在某個xml元素中?

我需要圍繞這些變量與XML元素,如果它們還沒有一個屬性,如果他們還不是UT元素的內部文本的一部分,就像這樣:

<ut DisplayText="{0}">&lt;{0}&gt;</ut> 

我輸入如下所示:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string {0} 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in: 
<ut DisplayText="\n">&lt;\n/&gt;</ut> {2}. 
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut> 

正確的輸出應該是這樣的:

<ut Type="start"DisplayText="string">&lt;string&gt;</ut> text string <ut DisplayText="{0}">{0}</ut> 
<ut DisplayText="{1}">&lt;{1}&gt;</ut> in: 
<ut DisplayText="\n">&lt;\n/&gt;</ut> <ut DisplayText="{2}">{2}</ut>. 
<ut Type="end" DisplayText="resource">&lt;/resource&gt;</ut> 

我最初的方法是使用正則表達式來匹配大括號中的術語,並使用模式替換在其周圍構建xml元素。如果在上面的第一個代碼塊中發現該模式,則此方法失敗。

上查找和替換patters(在記事本+ +):

查找

({[A-Za-z0-9]*}) 

更換

<ut DisplayText="\1">\1</ut> 

它開始看起來像正則表達式是不是爲工作的工具,所以我想就更好的方法採取一些建議,使用不同的工具,甚至只是一個更完整的正則表達式,這可能會讓我快速而可重複地解決這個問題。

更新:問題證明是比以前想象的更復雜一點。似乎還有一些需要保護的東西,涉及一些比較模糊的語法,將變量與文本混合在一起,看起來似乎是某種條件語句。從內存:

{o,choice|1#1 error|1&lt;{0,number,integer} errors} 

其中「錯誤」和「錯誤」是可翻譯的,不應受到保護。我們目前最簡單的解決方案是運行上述正則表達式,修復它創建的奇數個錯誤,然後運行一些更復雜的項目替換通道。它可以被抽象爲正則表達式,但現在沒有太多的意義。

除了提供的改進表達式之外,我非常欣賞指向xslt和其他編輯器的更好的正則表達式支持。在時間允許的情況下,我會玩一些選項。

+0

我沒有測試這一點,所以我把它在評論---如果數據格式是統一的,爲什麼不使用一個超前/回顧後?事情是這樣的:(?!<(= 「))({[A-ZA-Z0-9] *})(?!」) – Salty 2009-07-21 16:22:57

+0

你可以用正則表達式做到這一點,但不是記事本+ +正則表達式,顯然。他們錯過了幾個重要的功能,包括lookarounds。你有可能使用別的東西嗎? EditPad Pro的正則表達式支持是一流的。 – 2009-07-21 18:53:21

回答

0

我最終使用中的問題的正則表達式的組合,並手動固定引起奇數錯誤。這並不理想,但比試圖尋找完美解決方案要快。

1

讓我知道我的假設是否是錯誤的,但從您的示例看來,您似乎想要更改{}中的文本,而不是元素中的文本。對我來說,這似乎是一個簡單的XSLT使用。簡單地輸出UT元素,並處理它們之間的任何文本。

+0

這是正確的,再加上與不尋常的語法問題底部的附加項目。 – IanGilham 2009-07-22 18:14:12

0

爲什麼不嘗試使用表達式

(?< =。){[A-ZA-Z0-9] +}(?=。$)

這將找到{1個或多個字母或數字和}當這種模式遵循標籤和任何數量的空格,後面跟着任意數量的空格和換行。

相關問題