【问题标题】:How to remove a XML tag from String using regular expressions? [closed]如何使用正则表达式从字符串中删除 XML 标记? [关闭]
【发布时间】:2020-03-11 09:18:34
【问题描述】:

我有一个 Java 字符串,看起来像

<ns3:PaymentDetail>
<ns3:CVCCode>000</ns3:CVCCode>
<ns3:CardNumber>0000000000</ns3:CardNumber>
<ns3:ExpirationMonth>00</ns3:ExpirationMonth>
<ns3:ExpirationYear>0000</ns3:ExpirationYear>
<ns3:PinNumber>00000</ns3:PinNumber>
</ns3:PaymentDetail>

我想删除标签内容,让我的字符串看起来像

<ns3:PaymentDetail>

</ns3:PaymentDetail>

我想在这里使用正则表达式。 XML 很长,这些标签可以重复多次。 PaymentDetails标签前可以有ns1或ns23之类的,简单来说就是大小不固定。

【问题讨论】:

  • 我建议将其解析为 xml,使用 xpath 获取所有 PaymentDetail 节点并删除所有子节点。
  • 能否请您提及您想要的输出是什么?
  • 我只有字符串,必须将其存储在数据库中。
  • 我想去掉 paymentDetail 的内部标签。
  • @DattatraySatpute OP 想要删除 PaymentDetail 标签内的所有内容。

标签: java regex xml


【解决方案1】:

好的,我调查了一下,我认为这可能就是您要找的:

Pattern patternPaymentDetailOpen = Pattern.compile("<[a-zA-Z0-9]*:PaymentDetail>");
Pattern patternPaymentDetailClose = Pattern.compile("</[a-zA-Z0-9]*:PaymentDetail>");
Matcher matcherPaymentDetail = patternPaymentDetailOpen.matcher(input);
StringBuilder builder = new StringBuilder();
int pos = 0;
while (matcherPaymentDetail.find()) {
    builder.append(input, pos, matcherPaymentDetail.end());
    matcherPaymentDetail.usePattern(patternPaymentDetailClose);
    if (matcherPaymentDetail.find()) {
        builder.append(input, matcherPaymentDetail.start(), matcherPaymentDetail.end());
        pos = matcherPaymentDetail.end();
    }
    matcherPaymentDetail.usePattern(patternPaymentDetailOpen);
}
builder.append(input, pos, input.length());
System.out.println(builder.toString());

这只是一个快速而肮脏的代码,您应该对其进行测试并根据需要对其进行修改。我们的想法是,我们获取付款详细信息的第一个开始标签之前的所有内容,然后获取开始标签,然后搜索结束标签并获取它,但忽略介于两者之间的所有内容。对所有付款明细标签重复此操作。在最后一个付款明细标签关闭后,还取字符串的其余部分。

例子:

String input = "<parent><ns3:PaymentDetail>\n" +
                "<ns3:CVCCode>000</ns3:CVCCode>\n" +
                "<ns3:CardNumber>0000000000</ns3:CardNumber>\n" +
                "<ns3:ExpirationMonth>00</ns3:ExpirationMonth>\n" +
                "<ns3:ExpirationYear>0000</ns3:ExpirationYear>\n" +
                "<ns3:PinNumber>00000</ns3:PinNumber>\n" +
                "</ns3:PaymentDetail>"+
                "<another-tag> abc </another-tag>" +
                "<ns5:PaymentDetail>\n" +
                "<ns3:CVCCode>000</ns3:CVCCode>\n" +
                "<ns3:CardNumber>0000000000</ns3:CardNumber>\n" +
                "<ns3:ExpirationMonth>00</ns3:ExpirationMonth>\n" +
                "<ns3:ExpirationYear>0000</ns3:ExpirationYear>\n" +
                "<ns3:PinNumber>00000</ns3:PinNumber>\n" +
                "</ns5:PaymentDetail></parent>";

结果:

<parent><ns3:PaymentDetail></ns3:PaymentDetail><another-tag> abc </another-tag><ns5:PaymentDetail></ns5:PaymentDetail></parent>

【讨论】:

    【解决方案2】:

    你可以简单地替换所有

    公共类测试{

    public static void main(String[] args) {
        String oldString = "<ns3:PaymentDetail><ns3:CVCCode>000</ns3:CVCCode><ns3:CardNumber>0000000000</ns3:CardNumber><ns3:ExpirationMonth>00</ns3:ExpirationMonth><ns3:ExpirationYear>0000</ns3:ExpirationYear><ns3:PinNumber>00000</ns3:PinNumber></ns3:PaymentDetail>";
    
        String newString = oldString.replaceAll("<ns3:PaymentDetail>[\\s\\S]*?</ns3:PaymentDetail>",
                "<ns3:PaymentDetail></ns3:PaymentDetail>");
        System.out.println(newString);
    }
    

    }

    【讨论】:

    • Bro ns3 动态生成。它不是硬编码的,我也需要一些正则表达式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多