简体   繁体   English

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

[英]Replacing a line in java from a substring using regex

Say I have a multiple files which look like follows, and I'm looping through storing them in a variable called 'text': 假设我有多个如下所示的文件,并且正在循环将它们存储在名为“ text”的变量中:

<Property name="FirstProp"><![CDATA[  ]]></PackageProperty>
<Property name="SecondProp"><![CDATA[  ]]></PackageProperty>
<Property name="ThirdProp"><![CDATA[  ]]></PackageProperty>

Some of the files can have CDATA in them, so the only thing each has in common is the property name. 一些文件中可以包含CDATA,因此每个文件唯一的共同点是属性名称。 I've stored the PropertyNames in a String array called propNames[ ]. 我已经将PropertyNames存储在一个名为propNames []的字符串数组中。 So, "SecondProp" would be propNames[1]. 因此,“ SecondProp”将是propNames [1]。

I now want to replace the second line to include some CDATA, I've tried this but it doesn't work because I only want it to look before and after the current line, not the entire file. 现在,我想替换第二行以包含一些CDATA,我已经尝试过了,但是它不起作用,因为我只希望它在当前行之前和之后查找,而不是整个文件。

String CDATAReplacement = "<Property name=\"SecondProp\"><![CDATA[ Some Value ]]></PackageProperty>";
text.replaceAll( "(.*)"+propNames[1]+"(.*)", CDATAReplacement )

End result: 最终结果:

<Property name="FirstProp"><![CDATA[  ]]></PackageProperty>
<Property name="SecondProp"><![CDATA[ Some Value ]]></PackageProperty>
<Property name="ThirdProp"><![CDATA[  ]]></PackageProperty>

I could do this quite easily using sed and execute the script within the java program, but I know it's bad practise so a Java solution would be better. 我可以使用sed轻松执行此操作,并在java程序中执行脚本,但是我知道这是不好的做法,因此Java解决方案会更好。

I would recommend you to use JDOM Library to work with XML: http://www.studytrails.com/java/xml/jdom2/java-xml-jdom2-xpath.jsp . 我建议您使用JDOM库来处理XML: http : //www.studytrails.com/java/xml/jdom2/java-xml-jdom2-xpath.jsp So you can work through XPath instead of regexps . 因此,您可以通过XPath而不是regexps进行工作。

First of all since it's xml I would recommend a xml manipulation library. 首先,因为它是xml,所以我建议使用xml操作库。 However if you still want to use regex, I would recommend atleast validating the line a bit more so you dont end up replacing a line which happens to have the the name "SecondProp" in its value, or as part of its own name. 但是,如果您仍然想使用正则表达式,建议您至少对行进行更多的验证,以免最终替换值恰好具有名称“ SecondProp”或作为其自身名称一部分的行。

If you loaded the file normally with line endings, your code should however work. 如果您通常以行结尾加载文件,则您的代码应该可以工作。 By default regular expressions in java are limited lines, Multi-line mode is off by default. 默认情况下,java中的正则表达式为限制行,默认情况下,多行模式为关闭状态。

Here's a an example of a better matching regular expression though. 这是一个更好匹配正则表达式的示例。

String regex =  "<property name=\"" + propertyName + "\"><!\\[CDATA\\[" + "([\s]*)" + "\\]\\]>" + "</packageProperty>";

Example: 例:

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);

This should work the resulting output for this code is: 这应该可以使此代码的结果输出为:

<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