Как получить часть данных с помощью регулярного выражения

#regex

#регулярное выражение

Вопрос:

У меня есть пример, который :

 [Unit] = 
[Diag] = Nilan zok-98
Alert danger C-00N47

[Unit] = 17B NORWAY 
[Diag] = Mobari-testing-17-AB
Pair num to get 17-9881 to be testing
Class nump

[Unit] = 
[Diag] = BLOC1 
 

Я хочу извлечь этот пример из двух частей, как показано ниже :

 Match 1
Group 1.    [Unit] = 
Group 2.    [Diag] = Nilan zok-98
Alert danger C-00N47

Match 2
Group 1.    [Unit] = 17B NORWAY 
Group 2.    [Diag] = Mobari-testing-17-AB
            Pair num to get 17-9881 to be testing
            Class nump

Match 3
Group 1.    [Unit] = 
Group 2.    [Diag] = BLOC1 
 

Я использовал (.*[Unit].*n).*(.*[Diag].*) для получения решения, но раздел Diag всегда получает первую строку.

Вы найдете мое тестовое регулярное выражение здесь: https://regex101.com/r/p6nLiK/1

Ответ №1:

Вы можете использовать

 ([Unit].*)n([Diag].*(?:n. )*)
 

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

Подробные сведения:

  • ([Unit].*) — Группа 1: [Unit] и остальная часть строки
  • n — символ перевода строки
  • ([Diag].*(?:n. )*) — Группа 2: [Diag] , затем остальная часть строки, а затем ноль или более непустых строк.

Вариант шаблона

 (?m)^([Unit].*)n([Diag].*(?:nh*S.*)*)
 

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

Здесь (?m)^ сопоставляется с любым началом позиции строки и h*S.* приводит ее в соответствие с непустыми строками ( h* соответствует нулю или более горизонтальных пробелов и S соответствует любому символу, не содержащему пробелов). Замените h на [p{Zs}t] или [^Srn] , если не поддерживается.