2017-09-05 22 views
1

나는이 문제를 적절히 나누는 방법을 찾으려고 노력하고 있지만 지금까지 많은 문제가 있습니다.서식있는 텍스트를 richtext 코드를 포함한 목록으로 분할

string.split/string.substring, string.indexof, string.replace 등을 사용합니다.

여기에 목록으로 분할해야하는 샘플 문자열이 있습니다. 내가

같은 것들을 시도

splitStart = baseString.Value.Split(' '); 
foreach (string part in splitStart) 
{ 
    if (part.Contains("<")) 
    { 
     // get the parts <b> <i> <size> <color> </b> </i> </size> </color> \n 
     textlist.Add(part); // add each part to list 
    } 
    else 
    { 
     textlist.Add(part); 
     Debug.Log(part); 
    } 
} 

:

0: We 
1: are 
2: <b> 
3: <i> 
4: very 
5: </i> 
6: </b> 
7: <b> 
8: a 
9: </b> 
10: mused! 
11: \n 
12: Thank 
13: you. 

그래서 내가 뭘하려고 오전 이것이다 :

We are <b><i>very</i></b><b>a</b>mused!\nThank you. 

하고 목록에서 결과

는이 순서에 있어야합니다
contains("<n>") 
replace "<n>" "" and add "<n>" to array 

하지만 그로 인해 시퀸이 깨질 수 있습니다. ce.

편집 : 나는 당신이 jsoup 또는 트리 구조 알고리즘과 같은 일부 HTML 파서를 사용하여 문자의 몇 가지 전처리가 필요하다고 생각이 C#을

+0

은 파서를 정의하는 매우 편리한 상황처럼 보입니다. 이를 위해 규칙이 명확해야합니다. '' "''을 기반으로 분할하면 태그는 모두 하나의 사슬에 담겨있는 것처럼 보입니다. 그렇다면'<'는 부분 문자열을 최종 목록으로 끌어 내기 위해 일치하는'> '을 찾아야합니다. 그런 다음'!'와'\ nT '는 특별한 처리가 필요합니다. – nullpointer

답변

0

위한 것이라는 말을 잊어 버렸습니다.

이 경우 Jsoup 라이브러리로 만드는 것이 하나의 옵션입니다.

1. Java 버전

첫째, html 태그에서 단어 목록을 준비합니다.

final List<String> wordList = new ArrayList<String>(); 

그런 다음 Jsoup의 NodeVisitor 클래스를 사용하여 html 콘텐츠를 탐색합니다.

doc.body().traverse(
      new NodeVisitor(){ 

       @Override 
       public void head(Node arg0, int arg1) { 
        if(arg1 == 1) 
        { 
         String value = arg0.outerHtml(); 
         if(!wordList.contains(value)) 
          wordList.add(arg0.outerHtml()); 
        } 
       } 

       @Override 
       public void tail(Node arg0, int arg1) { 

       } 
      } 
     ); 

마지막으로 코드는 다음과 같습니다.

import java.util.ArrayList; 
import java.util.List; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.nodes.Node; 
import org.jsoup.select.Elements; 
import org.jsoup.select.NodeVisitor; 

public class HtmlTest { 

    public static String parseHtml(String str) { 
     org.jsoup.nodes.Document doc = Jsoup.parse(str); 

     final List<String> wordList = new ArrayList<String>(); 

     doc.body().traverse(
      new NodeVisitor(){ 

       @Override 
       public void head(Node arg0, int arg1) { 
        if(arg1 == 1) 
        { 
         //String value = Jsoup.parse(arg0.outerHtml()).text(); 
         String value = arg0.outerHtml(); 
         if(!wordList.contains(value)) 
          wordList.add(arg0.outerHtml()); 

        } 

       } 

       @Override 
       public void tail(Node arg0, int arg1) { 

       } 
      } 
     ); 


     for(String word: wordList) 
     { 
      System.out.println(word); 
     } 

     return ""; 
    } 

    public static void main(String[] args) 
    { 
     System.out.println(parseHtml("We are <b><i>very</i></b><b>a</b>mused!\nThank you.")); 
    } 
} 

출력 모습이어야

We are 
<b><i>very</i></b> 
<b>a</b> 
mused! Thank you. 

2. C# 버전

음, C# 버전의 소스 코드는 litte 비트 다르지만 동일한 프로세스 (약간의 변경이 필요함).

이것은 내 NodeVisitor 버전의 코드입니다.

먼저 HTML 내용을 구문 분석하십시오.

Document doc = NSoupClient.Parse(str); 

둘째, 'body'태그에서 원본 문장을 선택하십시오.

doc.Select("body").Traverse(new TestNodeVisitor(wordList)); 

전체 코드는 다음과 같습니다.

using NSoup; 
using NSoup.Nodes; 
using NSoup.Select; 
using System; 
using System.Collections.Generic; 
using System.IO; 
namespace NSoupTest 
{ 

    class Program 
    { 

     private class TestNodeVisitor : NodeVisitor 
     { 
      List<String> wordList; 

      public TestNodeVisitor(List<String> wordList) 
      { 
       this.wordList = wordList; 
      } 

      public void Head(Node node, int depth) 
      { 
       if(depth == 1) 
       { 
        String value = node.OuterHtml(); 

        if(!wordList.Contains(value)) 
         wordList.Add(value); 
       } 

      } 

      public void Tail(Node node, int depth) 
      { 

      } 
     } 


     public static String parseHtml(String str) { 
      Document doc = NSoupClient.Parse(str); 


      List<String> wordList 
       = new List<String>(); 

      doc.Select("body").Traverse(new TestNodeVisitor(wordList)); 


      foreach (String word in wordList) 
      { 

       Console.WriteLine(word); 
      } 

      return ""; 
     } 

     static void Main(string[] args) 
     { 
      try 
      { 
       parseHtml("We are <b><i>very</i></b><b>a</b>mused!\nThank you."); 
      } 
      catch (FileNotFoundException fe) { 
       Console.WriteLine(fe.Message); 
      } 

     } 
    } 
} 

출력은

We are 
<b><i>very</i></b> 
<b>a</b> 
mused! Thank you. 

당신은 내가 site에서 현재 (사실이 아닌 공식 버전 0.8.0)에서 사용 NSoup 라이브러리를 찾을 수 있어야한다.

공식 NSoup 사이트는 here이지만 방문자 인터페이스는 없습니다.

그런 다음 독자적인 방법으로 코드를 완성 할 수 있습니다.

귀하의 목표에 맞는 옵션 일뿐입니다.

Regard,

+0

안녕하세요, 죄송 합니다만 C# 용이라고 깜빡하고 있습니다. 결과도 내 샘플에 표시된 것과 같아야합니다. –