В .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%, что делаете.