RegEx: не захватывать матч, но захватывать после матча - PullRequest
0 голосов
/ 20 февраля 2019

На SO есть тысяча вопросов по регулярным выражениям, поэтому я прошу прощения, если это уже освещено.Я посмотрел первым.

У меня есть строка:

Name Subname 11X22 88X620 AB33(20) YA5619 77,66

Мне нужно захватить эту строку: YA5619

Я просто нахожу AB33(20)и после этого я захвата до первого пробела.Но AB33(20) может быть AB-33(20) или AB33(-20) или AB33(-1).

Мое регулярное выражение preg_match: (?<=\bAB\d{2}\(\d{2}\)\s).+?(?=\s)

Почему я получаю ошибку при переходе с \d{2}на \d+?

Для окончательного результата я думал, что этот регулятор будет работать, но нет:

(?<=\bAB-?\d+\(-?\d+\)\s).+?(?=\s)

Есть идеи, что я делаю неправильно?

Ответы [ 2 ]

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

Это зависит от языка.Например, если он находится в .NET, он соответствует из-за различной длины в области просмотра.

Другим решением может быть использование класса символов и добавление символа, которому вы позволите соответствовать,Затем сопоставьте символ пробела и захватите группу, соответствующую \S+, которая соответствует 1+ раз, а не символу пробела.

\bAB[()\d-]+\s\K\S+

Объяснение

  • \bAB Совпадение буквально с добавлением границы слова, чтобы AB не являлось частью большего совпадения.
  • [()\d-]+ Совпадение 1+ раз любого из перечисленных символов в классе персонажей
  • \s Совпадениесимвол пробела (или \s+ для соответствия 1 или более)
  • \K Сброс начальной точки сообщенного соответствия (Забудьте, что было найдено)
  • \S+ Совпадение в группе1+ раз не символ пробела

Regex demo | Php demo

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

В большинстве разновидностей регулярных выражений lookbehind должен вычислять последовательность фиксированной длины, поэтому вы не можете использовать переменные квантификаторы, такие как * или + или даже {1,2}.

Вместо использованияпосмотрите, вы можете просто сопоставить свой маркерный паттерн и затем забыть его с помощью \K.

AB-?\d+(?:\(-?\d+\))? \K[^ ]+

demo: https://regex101.com/r/8XXngH/1

...