RegEx сопоставить все, кроме разрывов строк до положительного взгляда - PullRequest
1 голос
/ 23 октября 2019

Я пытаюсь сопоставить определенные строки текста с определенной строкой в ​​RegEx (PCRE). Вот пример:

000000
999999900

20.10.19

Amoxicillin 1000 Heumann 20 Filmtbl. N2 - PZN: 04472730

-

Dr. Max Mustermann

В этом тексте я хотел бы точно подобрать эту часть:

Amoxicillin 1000 Heumann 20 Filmtbl. N2

Сходство всегда является частью с PZN и 7-8цифра за этим в конце каждой строки, которую я хочу сопоставить. Однако иногда часть PZN может находиться в следующей строке, а не непосредственно за ней:

000000
999999900

20.10.19

Amoxicillin 1000 Heumann 20 Filmtbl. N2
 - PZN: 04472730

-

Dr. Max Mustermann

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

.*(?=[ \-\r\n]+PZN)

Это работает, однако, в первом примере выше, это соответствует этому:

Amoxicillin 1000 Heumann 20 Filmtbl. N2 -

Обратите внимание на "-"в конце. Это не должно быть включено в матч. Я полагаю, что RegEx отдает приоритет части .*, так как она работает слева направо, и поэтому удаляет только последний символ предпросмотра. Я не могу обернуть голову относительно того, как сделать это иначе.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Один из вариантов - использовать группу захвата и сопоставлять 0+ пробельных символов перед частью - PZN:.

^(?![^\S\r\n]*$)(.+)\s* - PZN: \d{7,8}$
  • ^ Начало строки
  • (?![^\S\r\n]*$) Не указывайте пустую строку
  • (.+)\s* Захват в группе 1, соответствующий любому символу 1+ раз, затем 0+ раз символ пробела
  • - PZN: Соответствует пробелу - и пробелузатем PZN: и пробел
  • \d{7,8} Совпадение 7-8 цифр
  • $ Конец строки

Regex demo

Другой вариант - тот же шаблон в форме использования заглядывания

^(?![^\S\r\n]*$).+(?=\s* - PZN: \d{7,8}$)

Regex demo

1 голос
/ 23 октября 2019

Это будет работать:

^(.+?)(?=\s?- PZN:)
  • ^(.+?) - в начале строки лениво совпадать со всеми
  • (?=\s?- PZN:) - скажите .+?, что нужно прекратить совпадение один размы обнаруживаем предстоящий PZN:

https://regex101.com/r/dhpth0/1/

...