Как сопоставить последний шаблон в Regex, используя .NET? - PullRequest
0 голосов
/ 24 февраля 2019

Я хотел бы извлечь номер, ближайший к разделу.В этом регулярном выражении \d+?[\r\n]+(.*)3.2.P.4.4.\s+Justification\s+of\s+Specifications

Цель - попытаться найти раздел, который начинается с числа и заканчивается указанным именем раздела.В этом случае имя раздела (3.2.P.4.4. Обоснование спецификаций)

Фактический результат - регулярное выражение соответствует всему содержимому, поскольку шаблон начинается с числа.Ожидаемый результат - регулярное выражение должно начинаться с 29, которое является ближайшим числом к ​​разделу.Я перепробовал множество вариантов, таких как неадекватные квантификаторы и т. Д., Но ни один из них не работает

https://regex101.com/r/Othmck/2

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

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

^ \d+[\r\n](?:(?!\s+\d+[\r\n]).*[\r\n])*3\.2\.P\.4\.4\.\sJustification\s+of\s+Specifications

См. regex .NET demo | C # demo

Пояснение

  • ^ Начало строки
  • \d+[\r\n] Пробел, 1+цифры и новая строка
  • (?: Группа без захвата
    • (?! Отрицательный взгляд на будущее, чтобы утверждать, что это не
      • \s+\d+[\r\n] Совпадение 1+ пробельных символов, 1+ цифри новая строка
    • ) Закрыть отрицательный прогноз
    • .*[\r\n] Сопоставить любой символ, заканчивающийся новой строкой
  • )* Закрыть группу без захвата и повторить 0+ раз
  • 3\.2\.P\.4\.4\.\sJustification\s+of\s+Specifications Соответствовать названию раздела
0 голосов
/ 24 февраля 2019

В .NET вы можете использовать опцию RegexOptions.RightToLeft для анализа текста с конца до его начала, таким образом, получая последнее совпадение гораздо быстрее и с более простыми шаблонами.

Используйте

var text = " 26\r\nData related to the point SP-WFI-21-Room process fluids  \r\nSampling Date:16/04/2007 \r\n 28\r\nData related to pint SP-WFI-21-Room process fluids  \r\nSampling Date: 20/04/2007 \r\nTEST SPECIFICATIONS RESULTS \r\n 29\r\n3.2.P.4.2 Analytical Procedures \r\nAll the analytical procedures \r\n3.2.P.4.3 Validation of Analytical Procedures \r\nAll the analytical procedures proposed to control the excipients are those reported in Ph. Eur. \r\n− 3AQ13A: Validation of Analytical Procedures: Methodology - EUDRALEX Volume 3A \r\n3.2.P.4.4. Justification of Specifications";
var pattern = @"^\s*\d+\s*[\r\n]+(.*?)3\.2\.P\.4\.4\.\s+Justification\s+of\s+Specifications";
var regEx = new Regex(pattern, RegexOptions.RightToLeft | RegexOptions.Singleline | RegexOptions.Multiline );

var m = regEx.Match(text);
if (m.Success)
{
    Console.WriteLine(m.Groups[1].Value);
}

См. Демонстрацию C # .

См. Демонстрацию .NET regex

Я просто добавил ^ (в многострочном режиме, начало строки) и \s* после \d+ (на всякий случай, если перед разрывом строки есть пробелы).Обратите внимание на экранированные точки.

Обратите внимание, что регулярное выражение .NET не поддерживает U модификатор переключения жадности, поэтому +? необходимо преобразовать в + и .* в .*?.На самом деле, в исходном регулярном выражении было + квантификаторов, которые должны были быть +?, что могло привести к другим ошибкам или неожиданному поведению. Не используйте модификатор U в PCRE , если вы не уверены на 100%, что делаете.

...