我在Java对象中有大xml。我想替换
<countryChannel countryCode="CountryCode"/>
with
<countryChannel countryCode="CountryCode" active="true"></countryChannel>
这是samle xml(输入)
</articleMedia>
<channels>
<countryChannel countryCode="CountryCode"/>
</channels>
</articleMedia>
<channels>
<countryChannel countryCode="CountryCode"/>
</channels>
</articleMedia>
<channels>
<countryChannel countryCode="CountryCode"/>
</channels>
我可以使用regex知道如何在countryChannel countryCode =“ CountryCode”之前的所有字符串中仅选择“ />”部分吗?
我有一个正则表达式只选择整个字符串
https://regex101.com/r/NLHy2Y/1,但是如何仅选择所有以“ countryChannel countryCode =“ CountryCode”“开头的“ />”?
最佳答案
在这种情况下,您甚至不需要正则表达式。您可以在正确的文本中使用String.replace()
:
String input = "<countryChannel countryCode=\"CountryCode\"/>\r\nsalala\r\n<countryChannel countryCode=\"CountryCode\"/>";
String replacement = input.replace("<countryChannel countryCode=\"CountryCode\"/>", "<countryChannel countryCode=\"CountryCode\" active=\"true\"></countryChannel>");
System.out.println(replacement);
这是一个技巧:如果您想将XML编辑为文本,则必须对xml的序列化方式做一些假设。在这种情况下,我假设:
您只需要编辑具有一个
<countryChannel>
属性的那些countryCode
标记它们的值始终为
CountryCode
所有这些标签都按如下方式序列化:
<countryChannel countryCode="CountryCode"/>
可能您也想包含其他国家/地区代码。只要它们不包含引号,就可以使用以下正则表达式进行操作:
"<countryChannel countryCode=\"([^\"]*)\"/>"
并在替换中使用反向引用$1
。在这种情况下,您需要String.replaceAll()
方法,因为它会评估正则表达式。代码如下所示:String input = "<countryChannel countryCode=\"CountryCode123\"/>\r\nsalala\r\n<countryChannel countryCode=\"CountryCode456\"/>";
String replacement = input.replaceAll("<countryChannel countryCode=\"([^\"]*)\"/>", "<countryChannel countryCode=\"$1\" active=\"true\"></countryChannel>");
System.out.println(replacement);
说明:
[^...]
是否定的字符类。即一切,除了那些字符。因此[^"]*
匹配字符(引号除外)。这很酷,因为我们想在实际属性的末尾停止匹配。因此,您可以检查大的xml文件并确保您具有正确的假设。
免责声明:
不要将此类正则表达式投入生产。这些正则表达式很适合自己编辑文件,只要您手动检查它们即可。但是,对于生产,最好使用XSLT。
关于java - 正则表达式选择在特定字符串之前的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49255527/