#c# #regex #regex-group
#c# #регулярное выражение #регулярное выражение-группа
Вопрос:
Я пытаюсь оценить, используя c #, содержимое строки, следующей этому шаблону (номер и описание разделены табуляцией — заголовок не является частью текста, только здесь для пояснения):
# description
1 first item
2 second item on two or
more lines of text
3 third item
и я хотел бы получить список совпадений, где есть группа для номера и группа для описания. Я почти достиг этого с помощью следующего регулярного выражения :
(?'number'd )(?:t)(?'description'. )
что дало мне 3 совпадения, но текст второго совпадения в новой строке всегда отбрасывается. Не могу найти, как включить текст в несколько строк в группе description.
Комментарии:
1. Не проще ли заменить любые разрывы строк, за которыми следует символ табуляции, одним пробелом в качестве шага предварительной обработки?
Ответ №1:
Вы могли бы использовать отрицательный прогноз, чтобы утверждать, что то, что следует за .*
, не является новой строкой и 1 цифрами, за которыми следует табуляция.
Повторите 0 раз, сопоставляя всю строку, чтобы сохранить ее в description
группе.
(?'number'd )t(?'description'. (?:n(?!d t).*)*)
Объяснение
(?'number'd )
Сопоставьте более 1 цифр в группеnumber
t
Сопоставьте вкладку(?'description'
Названная группа захватаdescription
.
Сопоставьте любой символ, кроме новой строки(?:
Группа, не захватывающаяn(?!d t).*
Сопоставьте новую строку и подтвердите, что то, что следует, не является цифрами 1 и табуляцией
)*
Закройте группу и повторите 0 раз
)
Закройте описание группы
Комментарии:
1. Большое вам спасибо. Это сработало как шарм! Даже добавлено необязательное ‘ n’ рядом с номером : @»(?’number’d (?:n?) )t(?’description’. (?:n(?!d t).*)*)»;
Ответ №2:
Попробуйте регулярное выражение: (?'number'd )t(?'description'. ?)(?=^d|Z)
Комментарии:
1. извините, но как только в описании появляется цифра, прекращайте работу…
2. @CarlVerret, я отредактировал сообщение, чтобы включить исправление.