2016-12-21 13 views
0

のように、動的に生成された文字列Iを持っている:私はのように文字列を分割したいスプリットJavaで文字列を含むHTML

String s = <span><input style='font-weight:bold'>Hello team</input></span> 

:何かをすることができ

String startTag = <span><input style='font-weight:bold'> 
String endTag = </input></span> 
String content = Hello Team 

文字列Sが(依存

<span style='font-weight:bold'>Hello team</span> 

または

のような)コードに
<td><input style='font-weight:bold'>Hello team</input></td> 

したがって、 '>'と '<'のインデックスに基づいて分割したいですか?

どうすれば実現できますか?

+0

[大文字でJavaScriptを分割文字列]の可能な重複(http://stackoverflow.com/questions/7888238/javascript-split-string-on-uppercase-characters) – sailens

+1

ああ解析HTMLは、のように聞こえます正規表現の仕事! –

答えて

0
public static void main(String[] args) { 
    String s = "<td><span><td><input style='font-weight:bold'>Hello team</input></td></span></td>"; 

    Pattern p = Pattern.compile("^(<.+>)([a-z A-Z ]+?)(</.+>)$"); 

    Matcher m = p.matcher(s); 

    if(m.matches()) { 
     System.out.println(m.group(1)); 
     System.out.println(m.group(2)); 
     System.out.println(m.group(3)); 
    } 
} 

これは、つもり仕事、m.group(0)ので、それはそれは正規表現使用 使用していない穴列である:正規化された文章をキャッチする正規表現を、あなたは、ウェブ上の例の多くを見つけます、 programation言語の多くは、正規表現のための彼らの適切なルールはこれが正規表現なしで

+0

それはIllegalStateExceptionを引き起こす – veraliesim

+0

それは私がそのような答えを見るたびに[この回答](http://stackoverflow.com/a/1732454/4370629)を考えるようになります。 – Spotted

+1

@ versiesim:ここに投稿する前に試してみたのは分かりません。申し訳ありませんが、私はいつも答えを前に確認しています;) – azro

0
public class Program{ 
public static void main(String[] args) { 
    String s = "<span><input style='font-weight:bold'>Hello team</input></span>"; 
    String sCheck = s; 

    int j=0; 
    int k=0; 
    String startTag=""; 
    String storedStartTag=""; 
    String endTag; 
    String storedEndTag=""; 
    boolean foundEnd=false; 

    if(s.charAt(0) == '<'){ 

     for (int i = 0;i<sCheck.length();i++){ 
      if(sCheck.charAt(i) == '>'){ 
       j=i; 
       startTag = sCheck.substring(0,j+1); 
       storedStartTag = storedStartTag + startTag; 
       sCheck = sCheck.substring(j+1,sCheck.length()); 
      } 
     } 
    } 

    for (int i = 0;i<s.length();i++){ 
      if(s.charAt(i) == '<'){ 
       if(s.charAt(i+1) == '/'){ 
        k=i; 
        foundEnd = true; 
       } 
      } 
      if (foundEnd == true){ 
        if(s.charAt(i) == '>'){ 
         endTag = s.substring(k,i+1); 
         storedEndTag = storedEndTag + endTag; 
        } 
      } 

    } 
    System.out.println(storedStartTag); 
    System.out.println(storedEndTag); 
}} 

注意する必要があり、それを解決しようとした、:)判断してはいけない)

0

分割するために、この(単線)を使用します。

String[] parts = s.split("(?<=>)(?=((?!<[^/]).)*$)|(?=</)", 3); 

これはサイズ3の配列に入力を分割:それは包装タグの任意の数の動作

parts[0] // opening tag(s) 
parts[1] // content 
parts[2] // closing tag(s) 

+0

私に[this](http://stackoverflow.com/a/1732454/4370629)...-) – Spotted

0

私は以下を使用し、それは私のために正常に動作します。助けてくれてありがとう! :)

   int i2 = s.indexOf(">"); 
      int count = 0; 
      LinkedList<Integer> indexes = new LinkedList<Integer>(); 
      while (i2 >= 0) { 
       indexes.add(i2); 
       i2 = s.indexOf(">", i2 + 1); 
       count ++; 
      } 
      int i1 = s.indexOf("</"); 
      int c = count/2; 
      int b = indexes.get(c-1); 

      String startTag = s.substring(0,b+1); 
      String content = s.substring(b+1,i1); 
      String endTag = s.substring(i1); 
+0

の非常に悪い考えを考えさせる。テキストに '<' or '>'を使用するとどうなりますか? jsoupを使用して解析し、フォーマットする:http://stackoverflow.com/questions/16521429/jsoup-simple-html-tag-splitting – tak3shi

1

また、SAXパーサーを使用することもできます。 独自たDefaultHandlerを実装し、次のメソッドオーバーライドします(文字[] CH、int型開始、int型の長さ)

ます。public void文字を

公共ボイドのstartElement(文字列URI、文字列のローカル名、 文字列QNAMEには、属性を属性)公共ボイドのendElement(文字列URI、文字列のローカル名、文字列QNAME)

ヘルプが必要な場合は、この例を見て:https://docs.oracle.com/javase/tutorial/jaxp/sax/parsing.html

幸運

関連する問題