繁体   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