Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用正则表达式替换子字符串中的java行_Java_Regex_Replace - Fatal编程技术网

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

使用正则表达式替换子字符串中的java行,java,regex,replace,Java,Regex,Replace,假设我有一个多个文件,如下所示,我将它们循环存储在一个名为“text”的变量中: <Property name="FirstProp"><![CDATA[ ]]></PackageProperty> <Property name="SecondProp"><![CDATA[ ]]></PackageProperty> <Property name="ThirdProp"><![CDATA[ ]]>

假设我有一个多个文件,如下所示,我将它们循环存储在一个名为“text”的变量中:

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