2015-11-16 45 views
0

我有一個xml字符串,我通過REST調用獲取。但是,某些屬性的值已損壞。例如:Java - 刪除XML屬性中的雙引號

<property name="foo" value="Some corrupted String because of "something" like that"/> 

我怎麼能代替雙引號無論是在Java中沒有值=或不/>用單引號follown前面,並得到一個有效的XML串出的是損壞的一個, 6?

編輯:

我試圖修改這一超前/回顧後發正則表達式是用於VisualBasic中。但是由於我猜想轉義字符不兼容,我無法創建它的Java版本。那就是:

(?<=^[^""]*""(?>[^""]*""[^""]*"")*[^""]*)"(?! \s+ \w+=|\s* [/?]?" >)|(?<!\w+=)""(?=[^""]*""(?>[^""]*""[^""]*"")*[^""]*$)

+0

請分享你有什麼到目前爲止已經試過。 –

+0

好吧,我試圖修改這個用於VisualBasic的lookahead/lookbehind正則表達式。但是由於我猜想轉義字符不兼容,我無法創建它的Java版本。這裏是: '(?<=^[^「」] *「」(?> [^「」] *「」[^「」] *「」)* [^「」] *)「(? !\ s + \ w + = | \ s * [/?]?「>)|(?<!\ w + =)」「(?= [^」「] *」「(?> [^」「] *」 「[^」「] *」「)* [^」「] * $)' – vahdet

+1

你最好用['\\ s + [\\ w:.-] + = \」([^ \ ] * |'](HTTPS(:\ 「(\\ S + [\\瓦特.-] + = \?!」 \\ S * />)[^ \ 「*)\] *?)」: //regex101.com/r/cP7fD2/1),然後只需替換每個組1中的雙引號。查看[此演示](http://ideone.com/Rx2q4H)。 –

回答

2

您可以使用以下正則表達式:

\s+[\w:.-]+="([^"]*(?:"(?!\s+[\w:.-]+="|\s*(?:\/?|\?)>)[^"]*)*)" 

regex demo。它將匹配任何屬性名稱/值對捕獲後者到組1中,我們可以在回調中更改。

這裏是一個Java code demo

String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <resources> <resource> <properties> <property name=\"name\" value=\"retrieveFoo\"/>\n<property name=\"foo\" value=\"Some corrupted String because of \"something\" like that\"/>"; 
StringBuffer result = new StringBuffer(); 
Matcher m = Pattern.compile("(\\s+[\\w:.-]+=\")([^\"]*(?:\"(?!\\s+[\\w:.-]+=\"|\\s*(?:/?|\\?)>)[^\"]*)*)\"").matcher(s); 
while (m.find()) { 
    m.appendReplacement(result, m.group(1) + m.group(2).replace("\"", "&quot;") + "\""); 
} 
m.appendTail(result); 
System.out.println(result.toString()); 

輸出:

<?xml version="1.0" encoding="UTF-8"?> <resources> <resource> <properties> <property name="name" value="retrieveFoo"/> <property name="foo" value="Some corrupted String because of &quot;something&quot; like that"/>

+0

將您的答案轉換爲C#給其他人(您的RegEx負責人)。 http://stackoverflow.com/a/37177420/214898 –