簡體   English   中英

使用正則表達式從子字符串替換Java中的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM