使用正则表达式替换子字符串中的java行
假设我有一个多个文件,如下所示,我将它们循环存储在一个名为“text”的变量中:使用正则表达式替换子字符串中的java行,java,regex,replace,Java,Regex,Replace,假设我有一个多个文件,如下所示,我将它们循环存储在一个名为“text”的变量中: <Property name="FirstProp"><![CDATA[ ]]></PackageProperty> <Property name="SecondProp"><![CDATA[ ]]></PackageProperty> <Property name="ThirdProp"><![CDATA[ ]]>
<Property name="FirstProp"><![CDATA[ ]]></PackageProperty>
<Property name="SecondProp"><![CDATA[ ]]></PackageProperty>
<Property name="ThirdProp"><![CDATA[ ]]></PackageProperty>
一些文件中可以包含CDATA,因此每个文件唯一的共同点就是属性名。我已将PropertyNames存储在名为propNames[]的字符串数组中。所以,“SecondProp”应该是propname[1]
现在我想替换第二行以包含一些CDATA,我已经尝试过了,但它不起作用,因为我只希望它查看当前行之前和之后,而不是整个文件
String CDATAReplacement = "<Property name=\"SecondProp\"><![CDATA[ Some Value ]]></PackageProperty>";
text.replaceAll( "(.*)"+propNames[1]+"(.*)", CDATAReplacement )
字符串CDATAReplacement=”“;
text.replaceAll(“(.*”)+propNames[1]+“(.*”,CDATA替换)
最终结果:
<Property name="FirstProp"><![CDATA[ ]]></PackageProperty>
<Property name="SecondProp"><![CDATA[ Some Value ]]></PackageProperty>
<Property name="ThirdProp"><![CDATA[ ]]></PackageProperty>
我可以很容易地使用sed实现这一点,并在java程序中执行脚本,但我知道这是一种不好的做法,因此java解决方案会更好。首先,由于它是xml,我建议使用xml操作库。 但是,如果您仍然想使用正则表达式,我建议至少多验证一点该行,这样您就不会替换一行,因为该行的值中碰巧有名称“SecondProp”,或者作为其自身名称的一部分 如果您正常加载带有行尾的文件,那么您的代码应该可以工作。默认情况下,java中的正则表达式是有限行,默认情况下禁用多行模式 下面是一个更好匹配正则表达式的示例
String regex = "<property name=\"" + propertyName + "\"><!\\[CDATA\\[" + "([\s]*)" + "\\]\\]>" + "</packageProperty>";
String regex=“”+”;
例如:
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));
字符串行=”;
字符串propertyname=“SecondProp”;
字符串=”;
字符串regex=“”+”;
系统输出打印项次(行);
System.out.println(line.replaceAll(regex,CDATAReplacement));
字符串测试=“\n\n”;
字符串test1=“”;
test=test.replaceAll(“%SecondProp.*”,test1);
系统输出打印LN(测试);
这应该可以工作。此代码的结果输出为:
<Property name="FirstProp"><![CDATA[ ]]></PackageProperty>
<Property name="SecondProp"><![CDATA[ Some Value ]]></PackageProperty>
<Property name="ThirdProp"><![CDATA[ ]]></PackageProperty>
我建议您使用库来处理XML:。因此,您可以使用XPath而不是regexp。考虑到它正在处理XML,您是否尝试过使用XML库?我不是Java本地人,因此在这方面无法帮助您,但是对于.Net中的这项任务,我将考虑使用XML类来读取和更新此数据。我不确定我是否理解您在当前行之前和之后的意思不是整个文件?如果文件以文本形式存储,则replaceAll将查看整个文件。
<Property name="FirstProp"><![CDATA[ ]]></PackageProperty>
<Property name="SecondProp"><![CDATA[ Some Value ]]></PackageProperty>
<Property name="ThirdProp"><![CDATA[ ]]></PackageProperty>