使用正则表达式从子字符串替换java中的一行

时间:2014-11-24 16:22:59

标签: java regex replace

假设我有多个文件,如下所示,我将循环存储在一个名为' text':

的变量中
<Property name="FirstProp"><![CDATA[  ]]></PackageProperty>
<Property name="SecondProp"><![CDATA[  ]]></PackageProperty>
<Property name="ThirdProp"><![CDATA[  ]]></PackageProperty>

某些文件中可能包含CDATA,因此每个文件的唯一共同点是属性名称。我已将PropertyNames存储在名为propNames []的String数组中。所以,&#34; SecondProp&#34;将是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解决方案会更好。

3 个答案:

答案 0 :(得分:1)

我建议您使用JDOM库来处理XML:http://www.studytrails.com/java/xml/jdom2/java-xml-jdom2-xpath.jsp。因此,您可以使用XPath而不是regexp。

答案 1 :(得分:0)

首先,因为它的xml我会推荐一个xml操作库。 但是,如果您仍然想使用正则表达式,我建议至少再验证一行,这样您就不会最终更换一个恰好具有名称&#34; SecondProp&#34;在其价值中,或作为其自身名称的一部分。

如果您使用行结尾正常加载文件,则您的代码应该可以正常工作。默认情况下,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));

答案 2 :(得分: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>