2017-04-18 6 views
0

セイからの文字列の部分文字列の前後のインデックスを交換し、私は文字列を持っています。は、特定のインデックス

は今、私は、spanタグに最も内側のdivを有効にします。だから私は何をしたいですか:

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

これを行うには何かがありますか?あるいは、指定されたインデックスから部分文字列の前後の出現のインデックスを取得するだけですか?

編集:未知のタグを持っている(クラスとスタッフを有していてもよい)と(例では、タグなど)の間で何かがあるかもしれませんdivを指定するのを忘れていました。

+0

's.replace( "

Content
"、 "コンテンツ")'? – assylias

+0

@assylias残念ながら、未知のタグを持つdivを指定するのを忘れてしまい、 "content"と "divs"の間に未知のタグがある可能性があります –

+0

文字列置換をしようとするよりもHTMLを解析する方が良いかもしれません。 。 – assylias

答えて

1

それは最もエレガントな解決策ではないかもしれないけれどもあなたは間違いなく、正規表現でこれを行うことができます。これはnegative lookahead and negative lookbehindを使用して動作<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>"); 
+0

私の問題の素晴らしい解決策。しかし、私はそれが "replacePreviousOccurrence"と "replaceNextOccurrence"メソッドを含んでいても、それが奇妙なことを発見します。私はなぜJavaがindexOfやlastIndexOfのようなメソッドを使って部分文字列の最初と最後のインデックスを見つけるのか分からないが、その間のすべてのインデックスは見つからない。 –

+1

ここで興味深いアプローチを試すことができます:http://stackoverflow.com/questions/19035893/finding-second-occurrence-of-a-substring-in-a-string-in-java 基本的には、 indexOf()メソッドを使用して、検索を開始するインデックスを使用します。これを使用して、前後のオカレンスを取得することができます。 私はそれが含まれているための素晴らしい機能になることに同意しますが! – gwcoderguy

+0

素晴らしい@gwcoderguyに見えます。私はその機能を知っていましたが、以前の出来事を得る方法は見ませんでした。どのように説明していただけますか? –

1

あなたは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()); 
    } 

この例では、私は、テキスト(「.// DIV [テキスト()= 『コンテンツ』]」)によってノードを選択XPathを使用することに注意してください、ID、クラス、または他の属性によって選択することが非常にあります簡単です。しかし、これを処理するジェネリッククラスを書くことは、この種の置き換えをたくさん行う場合には良い考えです。

+0

この問題は、これが私の問題を解決します。しかし、私はそれが "replacePreviousOccurrence"と "replaceNextOccurrence"メソッドを含んでいても、それが奇妙なことを発見します。私はなぜJavaがindexOfやlastIndexOfのようなメソッドを使って部分文字列の最初と最後のインデックスを見つけるのか分からないが、その間のすべてのインデックスは見つからない。 –

関連する問題