c # РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ анализирует содержимое с новой строкой, включенной в группу

#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 раз
  • ) Закройте описание группы

Смотрите демонстрацию регулярных выражений .NET

Комментарии:

1. Большое вам спасибо. Это сработало как шарм! Даже добавлено необязательное ‘ n’ рядом с номером : @»(?’number’d (?:n?) )t(?’description’. (?:n(?!d t).*)*)»;

Ответ №2:

Попробуйте регулярное выражение: (?'number'd )t(?'description'. ?)(?=^d|Z)

ДЕМОНСТРАЦИЯ

Комментарии:

1. извините, но как только в описании появляется цифра, прекращайте работу…

2. @CarlVerret, я отредактировал сообщение, чтобы включить исправление.