2017-02-20 18 views
1

Мне нужно разобрать некоторый текст из некоторых файлов и разделить ti по частям, зависит от простой текстовой части текста или html.Файл с простым текстом, смешанным с html - split on parts

Допустим, это пример текста

This section should include any considerations for: 

<ul> 
    <li>C</li> 
    <li>B</li> 
    <li>A</li> 
</ul> 

h1. Support Contracts 

<p>simple par</p> 

И это должно быть расщепляется как то (используется JSON нотации, из-за этого было быстро писать, не имеет значения, какой тип контейнера есть)

[{ 
    part: 1, 
    text: "This section should include any considerations for:" 
    }, 
    { 
    part: 2, 
    text:"<ul> <li>C</li><li>B</li> <li>A</li></ul>" 
    }, 
    { 
    part: 3, 
    text:"h1. Support Contracts" 
    }, 
    { 
    part: 4, 
    text:"<p>simple par</p>" 
    }] 

Html есть очень простой и все теги гарантированно закрыты (она генерируется программой)

Что способ наиболее быстрый (без использования какой-либо третьей стороной ЛИЭС)? Могу ли я использовать regex здесь для этой задачи?

+2

* он сгенерирован программой *: это не доказательство. –

+0

@ CasimiretHippolyte хорошо, пусть только представьте, что тогда. По крайней мере, такие условия – DanilGholtsman

+0

Почему бы не загрузить как HTML-документ? Затем вытащите соответствующие разделы? Тогда ваш код будет намного более надежным и будет более читаемым. Что вы делаете, это разбор HTML, поэтому лучше всего использовать парсер HTML. – Baldrick

ответ

1

Если я правильно понимаю ваши требования, я не уверен, что буду заниматься этим регулярным выражением. Похоже, это было бы достаточно просто, чтобы просто просмотреть текст, ищущий теги, и составить список предметов по ходу дела.

var pieces = new List<string>(); 
int current = 0; 
while (current < text.Length) 
{ 
    var first = text.IndexOf('<', current); 
    if (first != -1) 
    { 
     var second = text.IndexOf('>', first); 
     if (second != -1) 
     { 
      var tag = text.Substring(first+1, (second-first-1)); 
      var closeTag = $"</{tag}>"; 
      var close = text.IndexOf(closeTag, second+1); 
      if (close != -1) 
      { 
       close += closeTag.Length; 
       if (current < first) 
       { 
        pieces.Add(text.Substring(current, (first-current)).Trim()); 
       } 
       current = close + 1; 
       pieces.Add(text.Substring(first, (close-first)).Trim()); 
      } 
      else 
      { 
       current = second + 1; 
      } 
     } 
     else 
     { 
      current = first+1; 
     } 
    } 
    else 
    { 
     pieces.Add(text.Substring(current).Trim()); 
     break; 
    } 
} 
+0

О, ну, мне это нравится, просто и просто) – DanilGholtsman

+0

@ DanilGholtsman - Используя пару примеров текстов, составленных из 52 000 символов, и запустив синтаксический анализ в петле из 1000 итераций, потребовалось чуть больше секунды, чтобы разобрать мои система. Возможно, вы, возможно, немного очистите код, не уверен, нужны ли вам/нужны вызовы 'Trim'. Также проверьте его. Я проверил его немного, но могут быть ошибки «один за другим». – pstrjds

+0

Извините, что не ответил, простаивал – DanilGholtsman