Соответствие регулярному выражению на основе двух строк с использованием AND

Я хочу извлечь команды из строки. Команды, которые мне нужны, содержат конкретные идентификаторы 124 и 123, а также конкретные флаги od и xy. Поэтому я хочу извлечь все те команды, которые contained my ids [123|124] а также my flags[od|xy] только.

Строка: Z124xy54;Z123od33;Z123od343;Z251od541;Z251ab541;
Regex: Z[^;]*?(od|xy)[^;]*?;
Требуемый выход: [Z124xy54; Z123od33; Z123od343;]
Но текущий выход: [Z123xy54; Z123od33; Z123od343; Z251od541;]

Я знаю, почему так происходит, но не знаю, как это решить. Любой может помочь, пожалуйста

Другой образец:

Z124xy54;Z123od33;Z123od343;Z251od541;Z251ab541;Z123od343;
Z124xy54;Z123od33;Z123od343;Z251od541;Z251ab541;Z123od343X

1 ответ

Решение

Используйте:

(Z(?:123|124)(?:xy|od).*?(:?;|$))
  1. Начните с Z => (Z)
  2. Совпадение 123 или 124 без группы захвата => (?:123|124)
  3. Совпадение zy или od без захвата группы => (?: Xy|od)
  4. Совпадение с чем угодно, кроме перевода строки до первого; или конец строки найден без записи группы => (:?;|$)

Рабочая демонстрация: https://regex101.com/r/AugDZT/2

Другие вопросы по тегам