2014-11-24 89 views
0

說我有看起來像遵循多個文件從一個子更換線在Java中,和我通過將其存儲在一個名爲「文本」變量循環:使用正則表達式

<Property name="FirstProp"><![CDATA[ ]]></PackageProperty> 
<Property name="SecondProp"><![CDATA[ ]]></PackageProperty> 
<Property name="ThirdProp"><![CDATA[ ]]></PackageProperty> 

一些文件可以在其中包含CDATA,因此每個文件的唯一共同之處就是屬性名稱。我已經將PropertyNames存儲在名爲propNames []的字符串數組中。所以,「SecondProp」將是propNames [1]。

我現在想要替換第二行以包含一些CDATA,我試過這個,但它不起作用,因爲我只希望它在當前行之前和之後,而不是整個文件。

String CDATAReplacement = "<Property name=\"SecondProp\"><![CDATA[ Some Value ]]></PackageProperty>"; 
text.replaceAll("(.*)"+propNames[1]+"(.*)", CDATAReplacement) 

最終結果:

<Property name="FirstProp"><![CDATA[ ]]></PackageProperty> 
<Property name="SecondProp"><![CDATA[ Some Value ]]></PackageProperty> 
<Property name="ThirdProp"><![CDATA[ ]]></PackageProperty> 

我能做到這一點很容易使用SED和Java程序中執行腳本,但我知道這是不好的做法,讓一個Java解決方案會更好。

+0

鑑於它正在操縱XML,您是否嘗試過使用XML庫?我不是Java本地人,所以不能幫助你,但是在.Net中這個任務我會考慮使用XML類來讀取和更新這些數據 – 2014-11-24 16:30:57

+0

我不確定我理解你是指當前行不是整個文件?如果文件存儲在文本中,則replaceAll將查看整個文件。 – brso05 2014-11-24 16:39:17

回答

0

首先,因爲它的XML我會推薦一個XML操作庫。 但是,如果你仍然想使用正則表達式,我會建議atleast至少驗證一行,所以你不會最終替換一個恰好在其值中有「SecondProp」這個名字的行,或者作爲它自己名字的一部分。

如果您通常使用行尾加載文件,那麼您的代碼應該可以工作。默認情況下,java中的正則表達式是有限的行,多行模式默認是關閉的。

雖然這是一個更好的匹配正則表達式的例子。

String regex = "<property name=\"" + propertyName + "\"><!\\[CDATA\\[" + "([\s]*)" + "\\]\\]>" + "</packageProperty>"; 

例子:

String line = "<property name=\"SecondProp\"><![CDATA[ ]]></packageProperty>"; 
String propertyname = "SecondProp"; 
String CDATAReplacement = "<Property name=\"SecondProp\"><![CDATA[ Some Value ]]></PackageProperty>"; 
String regex = "<property name=\"" + propertyName + "\"><!\\[CDATA\\[" + "([\s]*)" + "\\]\\]>" + "</packageProperty>"; 
System.out.println(line); 
System.out.println(line.replaceAll(regex,CDATAReplacement)); 
0
String test = "<Property name=\"FirstProp\"><![CDATA[ ]]></PackageProperty>\n<Property name=\"SecondProp\"><![CDATA[ ]]></PackageProperty>\n<Property name=\"ThirdProp\"><![CDATA[ ]]></PackageProperty>"; 
String test1 = "<Property name=\"SecondProp\"><![CDATA[ Some Value ]]></PackageProperty>"; 
test = test.replaceAll(".*SecondProp.*", test1); 
System.out.println(test); 

這應該適用於該代碼的輸出結果爲:

<Property name="FirstProp"><![CDATA[ ]]></PackageProperty> 
<Property name="SecondProp"><![CDATA[ Some Value ]]></PackageProperty> 
<Property name="ThirdProp"><![CDATA[ ]]></PackageProperty>