2017-02-23 83 views
-1

我有一個XML文件沒有雙引號的屬性值。以下是一個示例。正如你所看到的,這些都是可能的值,我嘗試使用正則表達式*=\s*([^" >]+),並用="\1"取代,這在大多數情況下起作用,但它有兩個問題。
任何幫助,將不勝感激。正則表達式記事本+ +:使用查找替換爲XML屬性值引用替換

  1. 它不會用雙引號(「」)替換空值(eg.status)。
  2. 它取代僅當值具有sentence.eg的第一個字(介紹)

樣品輸入:

<tool id=2 code=abc description=my description end here my_levels=$15,000/$30,000 individual_level= amount=0 status= my_code=P my_date=2017-02-21T00:00:00 points= /> 

預期的結果:

<tool id="2" code="123abc" description="my description end here" my_levels="$15,000/$30,000" individual_level="" amount="0" status="" my_code="P" my_date="2017-02-21T00:00:00" points="" /> 
+0

你可能不會用正則表達式來解決這個問題。生成無效的XML已經丟棄了一些信息。由於屬性值可能包含等號符號(不能確定它們沒有),因此存在無法解析的歧義。唯一合理的解決方案是在源代碼處修復XML的生成,這是屬性值明確已知的地方。 –

+0

我相信我們沒有=在xml中的值。 – KKR

回答

1

這可以超出正則表達式,但只要你的值中沒有任何等號就可以工作:

搜索:\b(\w+)=((?:\s*[^=>]+\b(?!=))+)?(\s+|\/?>)

替換:$1="$2"$3

  • \b字邊界匹配
  • (\w+)匹配的一個或多個單詞字符並捕獲爲 '組1' - 中所引用的替換作爲$1
  • (開始「組2」 - 在替換中引用爲$ 2
    • (?:啓動組,但不捕獲 - 我們這樣做,所以我們可以使用+炭末重複
      • \s*匹配零個或多個空白字符是
      • [^=>]+匹配一個或多個字符不=>
      • \b匹配一個字邊界 - 沒有這個它將繼續匹配下一財產的一部分
      • (?!=)可以確保未來茶類別不是=這被稱爲負面預測 - 要小心這些,它們是使正則表達效率低下的好方法。http://www.regular-expressions.info/lookaround.html
    • )+關閉非捕獲組,和與之相匹配的一個或多個次
  • )?關閉第2組,並使其可選使用?字符
  • (\s+|/?>)確保它與空白結束或標籤的結尾 - 將其捕獲爲「組3」 - 用於替換$3
    • \s+空白或自我結束標記標籤的
    • >結束
    • /?可選的斜槓

看到它在這裏的行動:https://regex101.com/r/zYdzQB/2

一些注意事項:

  • 你會需要仔細檢查結果
  • 你不應該自動化這個,它不是一個解決問題的有效方法,但是如果你有一個破損的文件來修復,那麼它可能是合適的。
  • 如果您有任何檢查數據生成方式的可能性並修復此問題,那麼最好不要這樣做。
+0

嘗試了它,但沒有正確地將引號添加到結束標記旁邊的值。例如points =「3」> – KKR

+0

我已經更新了答案和鏈接的正則表達式來應對這個問題 – Theo

+0

非常感謝!你太棒了.. – KKR