2011-07-06 22 views
0

我搞砸了。在我的xml中,每個非首選術語都有一個首選術語可供使用: 我已經完成的某些操作創建了一些非特殊術語,其中首選術語與此非首選術語完全相同。在文本編輯器中使用查找和替換刪除重複值

<term> 
<termId>127699289611384833453kNgWuDxZEK37Lo4QVWZ</termId> 
<termUpdate>Add</termUpdate> 
<termName>Adenosquamous Carcinoma</termName> 
<termType>Nd</termType> 
<termStatus>Active</termStatus> 
<termApproval>Approved</termApproval> 
<termCreatedDate>20110704T09:41:31</termCreatedDatae> 
<termCreatedBy>admin</termCreatedBy> 
<termModifiedDate>20110704T09:45:17</termModifiedDate> 
<termModifiedBy>admin</termModifiedBy> 
<relation> 
    <relationType>USE</relationType> 
    <termId>1276992897N1537166632rbr7BISWAI93SarY118G</termId> 
    <termName>Adenosquamous Carcinoma</termName> 
</relation> 

有一個找到一個文本編輯器和替換功能,我可以用它來告訴它,如果在=的實際術語,只是刪除整?我查看了相關的查詢,他們提到了正則表達式,但我花了很多時間試圖構建它們,它們超出了我的範圍, 謝謝!

+0

現在閱讀您的文章3次,我沒有得到你想達到的。你可以添加一個「後」列表。你在哪個操作系統上? 「告訴它,如果在=部分混淆我...... –

+0

對不起,關於這個。非首選術語應該建議具有不同名稱的首選術語。它在中執行此操作,然後指定要使用的首選術語的ID和名稱。在上面的例子中,xml告訴系統使用與首選項相同的名稱作爲非首選項。因此,查找和替換將通過,找到這兩個屬性的值是相同的,並且在哪裏刪除整個術語。所以在上面的例子中,整個術語將被刪除。如果關係中的termName中的值不同,則不會有任何更改。 – Charlie

+0

我在Windows上,但如果需要我可以使用mac。因此,在上面,整個事情將被丟棄,因爲關係中的termName = 中的termName。如果它們不同,則什麼都不會改變。 – Charlie

回答

0

回答這個問題已經差不多3年了,但有一些Perl正則表達式可以用於這項任務。

查找和刪除在relation含有相同termName一個term塊以上對於術語本身可以用UltraEdit用於Windows v21.10.0.1032和最有可能還與其他的文本編輯器使用的支撐Perl正則表達式所定義的區分大小寫的Perl正則表達式用搜索字符串替換:

^[ \t]*<term>(?:(?!</term>)[\S\s])+<termName>([^\r\n]+?)</termName>(?:(?!</term>)[\S\s])+<relation>(?:(?!</term>)[\S\s])+<termName>\1</termName>(?:(?!</term>)[\S\s])+</term>[ \t\r]*\n 

替換字符串是一個空字符串。

說明:

^ ......開始在一行的開頭每個搜索。

[ \t]* ...行的開頭可以有0個或多個空格或製表符。

<term> ......這個字符串必須在下一行找到。

下一頁棘手的表達式如下這是需要的任何字符匹配感興趣,但以避免在明年term塊匹配的東西下一個字符串,如果其餘的表達並不當前term塊返回一個積極的結果。

(?:(?!</term>)[\S\s])+ ...此表達式找到任何字符,因爲[\S\s]匹配任何非空白字符或任何空格字符。由於+,下一個固定字符串必須至少有1個字符,但它也可以是更多字符。此外,Perl正則表達式必須使每個匹配的字符都向前看,以檢查是否不符合</term>。如果當前匹配字符的右側存在字符串</term>,則Perl正則表達式引擎必須停止匹配流中當前位置的任何字符,並繼續搜索字符串的下一部分。所以這個表達式可以匹配任何字符,但不能超出</term>,因此只有<term></term>之間的字符。由於?:沒有任何東西被捕獲/標記爲通過此表達式進行反向引用。

<termName> ...此固定字符串必須位於term塊內。

([^\r\n]+?) ...匹配術語名稱的字符並捕獲/標記此字符串以反向引用。除了否定字符類表達式[^\r\n]之外,還可以使用其他類定義,或者僅當點不匹配新行字符時纔可以使用.。如果未編碼的開角尖括號不可能是詞項名稱的一部分,也可能是([^<]+)。字符<必須根據XML規範使用&lt;進行編碼,除了CDATA塊內的元素值以外。

</termName> ...此固定字符串在term塊內必須在下一個找到。

(?:(?!</term>)[\S\s])+ ...再次term內的任意字符堵到下一個固定字符串。

<relation> ......一個term塊中這個固定字符串必須發現旁邊。

(?:(?!</term>)[\S\s])+ ...再次term內的任意字符堵到下一個固定字符串。

<termName> ...此固定字符串必須位於term塊內。

\1 ...此表達後面引用捕獲/標記項名稱,並且因此下一個字符串必須是相同的如上文所定義的術語的名稱。

</termName> ...此固定字符串在term塊內必須在下一個找到。

(?:(?!</term>)[\S\s])+ ...再次term內的任意字符堵到下一個固定字符串。

</term> ...這個固定的字符串標誌着term塊的一端必須發現旁邊。

[ \t\r]*\n ...匹配0個或多個空格,製表符和回車符,然後是一個換行符。所以這個表達式適用於DOS/Windows(CR + LF)和Unix(僅LF)文本文件。

也有可能用UltraEdit是:

(?s)^[ \t]*<term>(?:(?!</term>).)+<termName>([^<]+?)</termName>(?:(?!</term>).)+<relation>(?:(?!</term>).)+<termName>\1</termName>(?:(?!</term>).)+</term>[ \t\r]*\n 

(?s) ...這個表達在搜索字符串的開頭從匹配任何字符,除了行結束,真正的任何字符改變了.行爲,因此.現如[\S\s]

相關問題