2016-06-30 3 views
4

У меня есть фрагменты текста, и я хотел бы разделить их на строки. Проблема заключается в том, что они были отформатированы и поэтому я не могу разделить, как я обычно делаю что таким образом:Как разбить текст на строки на основе выражения регулярного выражения?

_text = text.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries) 
      .ToArray(); 

Вот образец текста:

adj 1: around the middle of a scale of evaluation of physical 
     measures; "an orange of average size"; "intermediate 
     capacity"; "a plane with intermediate range"; "medium 
     bombers" [syn: {average}, {intermediate}] 
2: (of meat) cooked until there is just a little pink meat 
    inside 
n 1: a means or instrumentality for storing or communicating 
     information 
2: the surrounding environment; "fish require an aqueous 
    medium" 
3: an intervening substance through which signals can travel as 
    a means for communication 
4: (bacteriology) a nutrient substance (solid or liquid) that 
    is used to cultivate micro-organisms [syn: {culture medium}] 
5: an intervening substance through which something is 
    achieved; "the dissolving medium is called a solvent" 
6: a liquid with which pigment is mixed by a painter 
7: (biology) a substance in which specimens are preserved or 
    displayed 
8: a state that is intermediate between extremes; a middle 
    position; "a happy medium" 

Формат всегда одинаков:

  • 1-3 букв слово может присутствовать
  • номер 1-10
  • коло n
  • space
  • текст, который может отображаться на нескольких строках.

Так что в этом случае разрыв строки должен быть чем-то вроде 1-3 полукокса слова с последующим номером 1-2 символа, за которым следует:

Может кто-нибудь дать мне несколько советов о том, как я мог бы сделать это с помощью раскола или с помощью другого метода?

Обновление: ответ Стивена, но не совсем уверен, как это сделать в моей функции. Здесь я показываю свой исходный код и ниже предложили ответить на этот вопрос Steven, но есть часть отсутствует, что я не уверен:

public parser(string text) 
    { 
     //_text = text.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries) 
      // .ToArray(); 

     string pattern = @"(\w{1,3})?1?\d: (?<line>[^\r\n]+)(\r?\n\s+(?<line>[^\r\n]+))*"; 
     foreach (Match m in Regex.Matches(text, pattern)) 
     { 
      if (m.Success) 
      { 
       string entry = string.Join(Environment.NewLine, 
        m.Groups["line"].Captures.Cast<Capture>().Select(x => x.Value)); 
       // ... 
      } 
     } 
    } 

Для целей тестирования здесь текст в другом формате:

«среда \ n adj 1: вокруг середины шкалы оценки физических \ n мер, «оранжевый среднего размера», «промежуточная \ n емкость», «плоскость с промежуточным диапазоном», \ " средний \ n бомбардировщик \ "[syn: {average}, {intermediate}] \ n 2: (из мяса), приготовленный до появления небольшого розового мяса \ n внутри \ nn 1: средство или инструмент для хранения или передачи \ n информация \ n 2: окружающая среда; \ "рыба требует водной \ n среды \" \ n 3: inte что сигналы могут перемещаться как \ na для связи \ n 4: (бактериология) питательное вещество (твердое вещество или жидкость), которое \ n используется для культивирования микроорганизмов [син: {культуральная среда}] \ n 5: промежуточное вещество, через которое что-то достигнуто; «растворяющая среда называется растворителем \ n \ n 6: жидкость, с которой пигмент смешивается живописцем \ n 7: (биология) вещество, в котором сохранились образцы или \ n отображалось \ n 8: состояние, которое является промежуточным между крайностями; средняя \ n позиция; \ "счастливая среда \" \ n 9: кто-то, кто служит посредником между живыми и мертвыми; «он консультировался с несколькими медиумами» [син: {спиритуалист]] \ n 10: передачи, которые широко распространяются среди публики \ n [syn: {mass medium}] \ n 11: занятие, для которого вы особенно хорошо подходите ; \ "В \ п закона он обнаружил, что его истинная профессия \" [син: {профессия}] \ п [также: {СМИ} (мн)] \ п»

+0

не чувствует, как регулярное выражение год лучше всего, сделать это трудный путь – pm100

+0

Вы уже определили бизнес-правила. Во-вторых, не так много опыта с регулярными выражениями. Для ремонтопригодности, а также Я бы рекомендовал просто написать логику с помощью линейного анализа, чтобы проверить ваши условия. – Aphelion

ответ

2

Regex прекрасно работает для этого, например:.

public parser(string text) 
{ 
    string pattern = @"(?<line> (\w{1,3})?1?\d: [^\r\n]+)(\r?\n(?! (\w{1,3})?1?\d: [^\r\n]+)\s+(?<line>[^\r\n]+))*"; 
    var entries = new List<string>(); 
    foreach (Match m in Regex.Matches(text, pattern)) 
     if(m.Success) 
      entries.Add(string.Join(" ", 
       m.Groups["line"].Captures.Cast<Capture>().Select(x=>x.Value))); 
    _text = entries.ToArray(); 
} 
+0

Это выглядит очень впечатляюще. Можете ли вы взглянуть на мой вопрос. Я обновил его, чтобы показать, где можно использовать код, но я не уверен, что делать внутри блока (m.Success). –

+0

Не разделяйте его первым. Для правильной работы шаблона регулярного выражения требуется полный многострочный ввод. –

+1

Я не раскалывал его. Просто оставил эту часть, чтобы вы могли видеть, где мой исходный код :-) –

2

Попробуйте

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.IO; 

namespace ConsoleApplication106 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.txt"; 
     static void Main(string[] args) 
     { 
      string inputLine = ""; 
      List<Data> data = new List<Data>(); 
      string pattern = @"(?'prefix'\w*)?\s*?(?'index'\d+):(?'text'.*)"; 
      StreamReader reader = new StreamReader(FILENAME); 
      while ((inputLine = reader.ReadLine()) != null) 
      { 
       inputLine = inputLine.Trim(); 
       Match match = Regex.Match(inputLine, pattern); 
       Data newData = new Data(); 
       data.Add(newData); 
       newData.prefix = match.Groups["prefix"].Value; 
       newData.index = int.Parse(match.Groups["index"].Value); 
       newData.text = match.Groups["text"].Value; 
      } 
     } 
    } 
    public class Data 
    { 
     public string prefix { get; set; } 
     public int index { get; set; } 
     public string text { get; set; } 
    } 
} 
Смежные вопросы