#regex
#регулярное выражение
Вопрос:
У меня есть строка, из которой мне нужно извлечь значение «миграции» (динамический контент).
Проблема в том, что в отмеченном разделе есть несколько шаблонов. Вместо определения 2 регулярных выражений я хотел бы иметь его на одном.
(?i)Host: api-(.*?).A9net.io
(?i)Host: stt-(.*?).A9net.io
Один шаблон: Host: api-**migration**.A9net.io
Второй шаблон: Host: stt-**migration**.A9net.io
Мне нужно извлечь значение миграции
Ответ №1:
Вы можете использовать чередование для соответствия либо api, либо sst. Обратите внимание, чтобы избежать точки, чтобы соответствовать ей буквально.
(?i)Host: (?:api|stt)-(.*?).A9net.io
Демонстрация регулярных выражений
(.*?)
Совпадения 0 раз, которые также будут совпадать, когда миграции не будет. В этом случае вы могли бы использовать (. ?)
вместо этого, чтобы соответствовать хотя бы 1 символу.
Если значение переноса не может содержать точку, вы также можете использовать класс отрицаемых символов для сопоставления 1 раз без точки ([^.] )
Комментарии:
1. …или
/(?i)(?<=Host: (?:api|stt)-).*?(?=.A9net.io)/
.
Ответ №2:
Вы могли бы использовать этот шаблон: (?i)^Host: (?:stt|api)-([^.] ).A9net.io$
Как уже упоминалось, чередование является ключом к вашей проблеме.
Кроме того, рекомендуется использовать отрицаемый символьный класс вместо отложенного квантификатора (например, ?
), когда это возможно. В этом случае оно [^.]
соответствует одному или нескольким символам, отличным от точки, поэтому оно будет соответствовать до первого появления точки, чего вы хотите при использовании квантора lazu, за которым следует точка.