簡體   English   中英

替換特定索引中字符串中子字符串的上一個和下一個索引

[英]Replace previous and next index of a substring in a string from a specific index

說,我有一個字符串:

String someString = "<html><body><div><div><div class="unknown"><b>Content</b></div></div></div></body></html>";

在此字符串中,“內容”的位置是已知的。

現在,我想將最里面的div變成span標簽。 所以我想做的是:

someString.replacePreviousOccurrence(someString.indexOf("Content"), "<div ", "<span>");
someString.replaceNextOccurrence(someString.indexOf("Content"), "</div>", "</span>");

Java中有什么可以做的嗎? 還是僅從指定索引中獲取子字符串的上一個和下一個出現的索引?

編輯:忘記指定div具有未知標簽(可能有類和東西),並且它們之間可能有東西(如示例中的標簽)。

盡管它可能不是最優雅的解決方案,但您絕對可以使用regex做到這一點。 這是您可能使用的模式: <div>(?!<div>).*(?<!<\\/div>)<\\/div>

這可以通過使用負向前瞻和負向后瞻來實現 負向前看: (?!<div>)表示在不跟"<div>"位置找到此模式,而負向后看: (?<!<\\/div>)說在不向后的位置找到該模式</div>

因此模式分解為:

<div>   //matches <div>
    (?!<div>) //that isn't followed by <div>
           .* //followed by any character any number of times
    (?<!<\/div>) // Where the next match isn't preceded by <div>
<\/div>    //matches </div>

因此,對於此問題,您可以執行以下操作:

String str = "<html><body><div><div><div class="unknown"><b>Content</b></div></div></div></body></html>";
Pattern p = "<div>(?!<div>).*(?<!<\/div>)<\/div>";
Matcher m = p.matcher(str);
String output = m.replaceAll("<div>", "<span>").replaceAll("</div>", "</span>");

您可以使用內置功能來處理xml。

但是,很遺憾,這很冗長-但是可以。

 public static void replaceDivWithSpamByText() throws ParserConfigurationException, IOException, SAXException, XPathExpressionException, TransformerException {
        String html = "<html><body><div><div><div>Content</div></div></div></body></html>";
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(new ByteArrayInputStream(html.getBytes(StandardCharsets.UTF_8)));

        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xpath = xPathFactory.newXPath();
        Node contentNode = (Node) xpath.evaluate(".//div[text() = 'Content']", doc, XPathConstants.NODE);
        doc.renameNode(contentNode, null, "span");


        DOMSource domSource = new DOMSource(doc);
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.transform(domSource, result);

        System.out.println(writer.toString()); 
    }

請注意,在此示例中,我使用Xpath通過text(“ .// div [text()='Content']”)選擇節點,通過id,class或其他屬性進行選擇非常容易。 但是,如果您經常進行此類替換,那么編寫一個通用類來解決這個問題可能是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM