![](/img/trans.png)
[英]Java: Replace a specific character with a substring in a string at index
[英]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.