Поправить регулярку

173
21 ноября 2017, 20:37

Раньше не работал с регулярками, хороший пример чтоб потренироваться и научиться. Есть текст:

№   Вопрос  Ответ   
1   Дата звонка     08.08.2014   
2   Время звонка    16:30  
3   Имя оператора   Иванов Иван  
4   Номер телефона абонента     84957777777  
5   Кто звонит   
6   Номер карты  
7   Препарат  
8   Телефон  
9   Комментарий     тест звонок   

В нём как бы 3 столбца - номер, характеристика и значение, они разделены табуляцией, но 3 столбца может и не быть, соответственно табуляции перед ним тоже. Нужна регулярка, которая вытаскивает значения всех этих столбцов.

Есть такой вариант:

var TdPattern = new Regex(
            @"^ \s* (\d+) \s* \t ([^\t]+) \t \s* ([^\t]*) \s* $",
            RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);   

Он работает, но выдаёт кривой результат, если после 2 "колонки" не идёт табуляция.

Answer 1

Считывайте файл построчно и пользуйтесь обычным string.Split(), например:

class Data
{
    public string Num { get; set; }
    public string Question { get; set; }
    public string Answer { get; set; }
    public static Data Parse(string s)
    {
        var parts = s.Split('\t');
        var data = new Data { Num = parts[0] };
        if (parts.Length > 1) data.Question = parts[1];
        if (parts.Length > 2) data.Answer = parts[2];
        return data;
    }
}

Тогда загрузка будет выглядеть примерно так:

List<Data> list = File.ReadLines("путь к файлу")
                      .Select(Data.Parse)
                      .ToList();

Если данные не в файле, а в строковой переменной, то сплитьте ее сначала по переводам строки:

List<Data> list = text.Split(new[] { "\r\n" }, StringSplitOptions.None)
                      .Select(Data.Parse)
                      .ToList();

Символы перевода строки выберите подходящие, может вам достаточно будет просто '\n' или '\r'

Если могут попадаться пустые строки - можно пропустить их с помощью опции StringSplitOptions.RemoveEmptyEntries

Answer 2

Если столбцы действительно разделены табуляторами, а не пробелами, то поможет следующее регулярное выражение: ^(\d+)\t(.*?)(?:\t(.*))?$

В случае же, если столбцы разделены несколькими пробелами, то можно попробовать что-то вроде такого: ^(\d+)\s\s+(.*?)(?:\s[^\S\n]+(.*))?$

READ ALSO
Нужны советы профессионалов [требует правки]

Нужны советы профессионалов [требует правки]

Имеется тестовое заданиеПисать буду на С#

139
C# timer с ProgressBar

C# timer с ProgressBar

Натолкнулся на проблему которую не могу решитьЕсть обработчик кнопки и в ней код, timer используется как контролл из ToolBox на форме

197
Создание собственных координат внутри Canvas

Создание собственных координат внутри Canvas

Необходимо задать собственную систему координат в CanvasЗначения X и значения Y не будут одинакового типа

177
Как сделать отправку данных?

Как сделать отправку данных?

есть отправка данных при нажатии enter

303