正则表达式选择特定字符串前面的字符串

时间:2018-03-13 11:54:29

标签: java regex

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

我知道请使用正则表达式如何只选择“/&gt;” countryChannel countryCode =“CountryCode”之前的所有字符串的一部分?

我有一个正则表达式,只选择整个字符串 https://regex101.com/r/NLHy2Y/1,但我怎样才能只选择所有“/&gt;”在“countryChannel countryCode =”CountryCode“”之前?

1 个答案:

答案 0 :(得分:1)

在这种情况下,你甚至不需要正则表达式。您可以将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如何序列化做出一些假设。在这种情况下,我做出了以下假设:

  1. 您只想编辑那些具有一个<countryChannel>属性
  2. countryCode个标签
  3. 它们的值始终为CountryCode
  4. 并且所有这些标签都按如下方式序列化:<countryChannel countryCode="CountryCode"/>
  5. 您可能也希望包含其他国家/地区代码。只要它们不包含引号,您就可以使用以下正则表达式执行此操作:"<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。