假设我有多个文件,如下所示,我将循环存储在一个名为' 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解决方案会更好。
答案 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>