c # REGEX разобрать контент с новой строкой, включенной в группу - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь оценить, используя c #, содержимое строки, следующей за этим шаблоном (номер и описание разделены вкладкой - заголовок не является частью текста, только здесь для пояснения):

#   description
1   first item
2   second item on two or
    more lines of text
3   third item

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

(?'number'\d+)(?:\t)(?'description'.+)

, который дал мне 3 совпадения, но текст второго совпадения на новой строке всегда отбрасывается. Не удается найти способ включить текст в несколько строк в группе description .

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Вы можете использовать отрицательный прогноз, чтобы утверждать, что то, что следует за .*, не является новой строкой и 1+ цифрами, за которыми следует вкладка.

Повторите 0+ раз, сопоставляя всю строку, чтобы сохранить ее в группе description.

(?'number'\d+)\t(?'description'.+(?:\n(?!\d+\t).*)*)

Объяснение

  • (?'number'\d+) Совпадение 1+ цифр в группе number
  • \t Совпадение с вкладкой
  • (?'description' Именованная группа захвата description
    • .+ Совпадение с любым символомкроме новой строки
    • (?: Группа без захвата
      • \n(?!\d+\t).* Соответствует новой строке и утверждает, что ниже не 1+ цифр и табуляция
    • )* Закрыть группу и повторить 0+ раз
  • ) Закрыть описание группы

См. .NET regex demo

0 голосов
/ 28 марта 2019

Попробуйте Regex: (?'number'\d+)\t(?'description'.+?)(?=^\d|\Z)

Демо

...