[英]Replacing a line in java from a substring using regex
假設我有多個如下所示的文件,並且正在循環將它們存儲在名為“ text”的變量中:
<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解決方案會更好。
我建議您使用JDOM庫來處理XML: http : //www.studytrails.com/java/xml/jdom2/java-xml-jdom2-xpath.jsp 。 因此,您可以通過XPath而不是regexps進行工作。
首先,因為它是xml,所以我建議使用xml操作庫。 但是,如果您仍然想使用正則表達式,建議您至少對行進行更多的驗證,以免最終替換值恰好具有名稱“ 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));
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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.