отменить строковый шаблон, используя регулярное выражение re2, также с учетом регистра

Я использую регулярное выражение re2 для сопоставления и отрицания, как в этой ссылке

Ниже приведены все возможные входы

  1. abcd-st-ed-qrew
  2. ktm-ewe-abcd-st-ed-qrew
  3. abcd-st-wer-qrew-wabe
  4. ktm-ewe-abcd-st-qrew-qrrt

Условия:

  • Если строка начинается с abcd-, то она должна отрицать (не должна содержать) -ed
  • Если строка начинается с ktm- и также содержит -abcd-, то она должна отрицать (не должна содержать) -ed

Регулярное выражение должно быть опущено для 1-го и 2-го входов, поскольку оно содержит -ed. должен передавать 3-й и 4-й входы. Регулярное выражение в ссылке ссылки передано для случаев совпадения обоих условий, но не работает для отрицания (не содержания) вещей. Надежда нужна некоторая настройка, чтобы отрицать.

Примечание. Это для регулярного выражения данных prometheus в grafana. Поэтому я их тоже отмечаю.


person CdVr    schedule 25.07.2020    source источник
comment
Почему это не работает   -  person JvdV    schedule 25.07.2020
comment
Обратите внимание, что я не мог помочь вам с этим вчера, потому что ожидаемый результат, который вы упомянули в комментариях, не не имеет смысла и не соответствует условиям соответствия, которые вы упомянули. Я разместил ответ на этот вопрос на основе предоставленных вами условий. Надеюсь, условия, которые вы использовали здесь, являются более точным представлением того, что вам нужно.   -  person 41686d6564    schedule 25.07.2020


Ответы (1)


Вы можете использовать следующий шаблон:

^(?:ktm(?:-e|-(?:[^e\W]|e[^d\W])\w*)*-)?abcd(?:-e|-(?:[^e\W]|e[^d\W])\w*)*$

Демо.

Если вы хотите объединить его с регулярным выражением из вашего другого вопроса, это будет:

\bkey="((?:ktm(?:-e|-(?:[^e\W]|e[^d\W])\w*)*-)?abcd(?:-e|-(?:[^e\W]|e[^d\W])\w*)*)"

Демо.

Разбивка важной части (т.е. (?:-e|-(?:[^e\W]|e[^d\W])\w*) объясняется в мом ответе на другой вопрос. Эта часть используется как для abcd и ktm здесь. Дайте мне знать, что нужно что-то уточнить.

person 41686d6564    schedule 25.07.2020
comment
Просто обновление. Это работает. Но, поскольку реальная реализация находится в запросе Prometheus, нам нужно добавить экранирующий символ ^(?:ktm(?:-e|-(?:[^e\\W]|e[^d\\W])\\w*)*-)?abcd(?:-e|-(?:[^e]\W]|e[^d\\W])\\w*)*$. не могли бы вы также проголосовать за мой вопрос. так как кто-то проголосовал против, когда я голосую, он показывает 0. В любом случае, большое спасибо! - person CdVr; 30.07.2020