如何替换已知起始和结束的所有子串

时间:2017-06-14 13:23:58

标签: java regex

以下字符串

"<service id="any value"></service>"

我想在java中使用regex将其替换为以下内容

 <service></service>

如果字符串

中有多个服务标签,我写了以下内容但不起作用
string.replaceAll("^<service.*</service>$", "<service></service>");

示例:

<request>
  <service id="anyvalue"></service>
  <service id="anyvalue"></service>
</request>

3 个答案:

答案 0 :(得分:3)

您可以在开头和结尾^中使用不带$<service.*</service>的正则结构,因此如果您使用:

string.replaceAll("<service.*</service>", "<service></service>")

结果:

<request>
  <service></service>
  <service></service>
</request>

答案 1 :(得分:0)

使用以下regexp:

<service id=[^=]*<\/service>

它适用于多个服务标签

请参阅here

答案 2 :(得分:0)

使用正则表达式来修改你的xml总是一个问题,让我们假设你的正则表达式<service.*</service>目前适用于你的xml。 稍后您要更新xml以包含名为name的新属性:

<request>
  <service id="anyvalue" name="myservice"></service>
  <service id="anyvalue" name="myservice"></service>
</request>

并且您只想删除id属性。

你认为正则表达式会怎样?它也将删除name

我总是使用xml解析器来修改xml。

以下代码可以执行此操作:

try
{
    String input = "<request><service id=\"anyvalue\"></service><service id=\"anyvalue\"></service></request>";
    InputSource inputSource = new InputSource( new StringReader( input ) );

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse( inputSource );

    NodeList nodes = doc.getElementsByTagName("service");

    for ( int i = 0; i < nodes.getLength(); i++ )
    {
        Node node = nodes.item(i);
        if ( node.getNodeType() == Node.ELEMENT_NODE )
        {
            Element element = (Element)node;
            element.removeAttribute("id");
        }
    }

    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.setOutputProperty( OutputKeys.METHOD, "xml" );
    transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "true" );

    DOMSource xmlSrc = new DOMSource( doc.getDocumentElement() );
    StringWriter sw = new StringWriter();
    transformer.transform( xmlSrc, new StreamResult( sw ));
    System.out.println( "Modified xml is : " + sw.toString() );       

}
catch ( Exception e )
{
    e.printStackTrace();
}