Regex, используя позитивный взгляд вперед, а не сразу после - PullRequest
1 голос
/ 01 ноября 2019

У меня есть коды продуктов, например, HX3923, которые всегда начинаются с 2 заглавных букв и заканчиваются 4 цифрами. Некоторые продукты имеют "золотой" цвет, который находится где-то в тексте.

Пример:

HX3923, ширина: 0,3, высота: 0,7, золото, HX3924, цвет = "синий", ширина= 0,3

Мне нужно соответствовать HX3923 , но не HX3924 , так как последний не имеет золотого цвета.

Это выбирает обакоды продуктов

[A-Z][A-Z]\d\d\d\d

Я подумал, что мне нужно добавить что-то вроде

[?=gold)

Но это выглядит сразу после кода продукта. Как я могу убедиться, что он выглядит, если есть золото ДО того, как будет запущен следующий код продукта?

В настоящее время есть это некрасивое решение:

[A-Z][A-Z]\d\d\d\d(?=.{0,100}gold)

1 Ответ

0 голосов
/ 01 ноября 2019

Ваш текущий подход (?=.{0,100}gold) использует положительный прогноз, чтобы утверждать gold после 0 - 100 символов.

Вместо этого, один вариант - использовать группу захвата (), границы слов \b и закаленный жадный жетон подход к совпадению золота до встречи с другим шаблоном [A-Z][A-Z]\d{4}.

\b([A-Z][A-Z]\d{4})\b(?:(?![A-Z][A-Z]\d{4}).)*\bgold\b

По частям

  • \b([A-Z][A-Z]\d{4})\b Совпадение 2 заглавных букв и4 цифры в захвате группа 1
  • (?: Группа без захвата
    • (?! Отрицательный взгляд вперед, утверждают, что справа не
      • [A-Z][A-Z]\d{4} Совпадение 2 заглавных букв и 4 цифр
    • ). Закрыть прогноз и сопоставить любой символ, кроме новой строки
  • )* Закрытьгруппа без захвата и повторение 0+ раз
  • \bgold\b Совпадение gold между границами слов

Regex demo

Значенияв группе 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...