Обрезать значение после 2 текстовых шаблонов

#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, за которым следует точка.

ДЕМОНСТРАЦИЯ