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

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

\nSCR((?s).*)(GI|SI)(.*?)\n

Текст, по которому я подбираю.

Hierbij een test

SCR
S09
/vince@test.be
05FEB
GI BRGDS OPS

middle text string (may not selected)

SCR
S09
05FEB
LHR
NPVT700 PVT701 30MAR30MAR 1000000 005CRJ FAB1900 07301NCE DD
/ RE.GBFLY/
GI BRGDS

Выбрана средняя струна, ей нужен только SCR до линии GI.

0
Vince V. 29 Июл 2009 в 12:03
Пожалуйста, не называйте свой код Regex "он": P
 – 
Damien
29 Июл 2009 в 12:14

2 ответа

Лучший ответ

Чтобы сопоставить строку, начинающуюся с SCR, со строкой, начинающейся с GI или SI (включительно), вы должны использовать следующее регулярное выражение:

(?m:^SCR\n(?:^(?!GI|SI).*\n)*(?:GI|SI).*)

Это будет:

  • Найдите начало строки.
  • Сопоставьте SCR и новую строку.
  • Соответствовать всем строкам, не начинающимся с GI или SI.
  • Соответствует последней строке, требуя наличия GI или SI (это предотвращает совпадение с концом строки, если нет GI или SI.
1
Blixt 29 Июл 2009 в 12:39
Я просто немного изменил свое регулярное выражение, вдохновленный Гамбо. Его регулярное выражение учитывает тот факт, что если в группе нет строки GI или SI, регулярное выражение не должно совпадать. Теперь мое регулярное выражение и его второе регулярное выражение очень похожи, за исключением того, что мое использует привязку начала строки ^ вместо сопоставления новой строки.
 – 
Blixt
29 Июл 2009 в 12:41

Используйте нежадный квантификатор также для первого квантификатора:

\nSCR((?s).*?)(GI|SI)(.*?)\n

Или вы можете использовать отрицательное утверждение прогнозирования (?! expr ) для захвата только тех строк, которые не начинаются ни с GI, ни с SI:

\nSCR((?:\n(?!GI|SI).*)*)\n(?:GI|SI).*\n
2
Gumbo 29 Июл 2009 в 12:18