Регулярное выражение для получения языковых совпадений

#regex

#регулярное выражение

Вопрос:

У меня есть следующий ввод:

 _YUE_ENSUB_L9939486_16X9
  

И я хотел бы сопоставить на YUE и EN . Условия таковы:

  • Между двумя _ , это позволяет только [A-Z419] .
  • Оно не должно включать суффикс SUB , SUBS или FN .

Пока у меня есть:

 ([A-Z419] )(?:SUB|FN|SUBS)?
  

Или:

 [A-Z419]{2,5}(?=SUB)
  

Но оба немного отстают. Какое регулярное выражение было бы правильным для этого? Я полагаю, что возможно что-то подобное, но это кажется немного излишним и, вероятно, не очень подходит:

 [A-Z419] (?=SUB|FN|SUBS)|[A-Z419] (?!=SUB|FN|SUBS)
  

Вот примеры входных данных из regex101 .

Ответ №1:

Вы могли бы использовать группу захвата и переместить начало просмотра сразу после первого подчеркивания. Затем сопоставьте либо SUB с необязательными S или FN и подчеркиванием.

 _(?![A-Z419]*(?:SUBS?|FN)_)([A-Z419] )_
  

Объяснение

  • _ Совпадение буквально
  • (?! Отрицательный прогноз, утверждение, что то, что справа, не соответствует
    • [A-Z419]* Сопоставьте 0 раз любой из перечисленных символов
    • (?:SUBS?|FN)_ Сопоставьте либо SUB, либо SUBS, либо FN, за которыми следует _
  • ) Закройте предварительный просмотр
  • ( Захват группы 1
    • [A-Z419] Сопоставьте 1 раз любой из перечисленных символов
  • )_ Закройте группу и сопоставьте символ подчеркивания

Демонстрация регулярных выражений

Для обновленного вопроса вы могли бы получить только совпадения:

 (?<=_)[A-Z419] ?(?=(?:SUBS?|FN)?_)
  

Объяснение

  • (?<=_) Положительный взгляд назад, утверждение, что то, что находится непосредственно слева, является _
  • [A-Z419] ? Сопоставьте один из перечисленных символов, как можно меньше
  • (?= Позитивный прогноз, утверждение того, что находится прямо справа
    • (?:SUBS?|FN)?_ Необязательно сопоставлять SUB, SUBS или FN, за которыми следует _
  • ) Закройте предварительный просмотр

Демонстрация регулярных выражений

Комментарии:

1. Хорошо, но, похоже, в нем отсутствуют некоторые языковые соответствия. Для меня лучше всего подходит что-то вроде: (?<=_)([A-Z419] ?)(?:SUB|SUBS|FN)?(?=_)

2. Вот обновление о том, что также должно быть сопоставлено, если это поможет: regex101.com/r/Y6gxay/4 .

3. @carl.hiass Я добавил шаблон только для получения совпадений.

Ответ №2:

Поиск:

 ^_([^_]*)_([^_]*)(SUB|SUBS|FN)
  

У вас есть языки в группах захвата 1 и 2.

Проверьте здесь.


Для обновленного вопроса:

Регулярное выражение:

 _([A-Z419]*?)(SUB|SUBS|FN)?(?=_)
  

Языки находятся в группе захвата 1.

Проверьте здесь.

Комментарии:

1. Я обновил входные данные в вопросе. Вот ссылка: regex101.com/r/Y6gxay/2 .

2. отлично, это работает. Я бы немного скорректировал его, чтобы сделать часть не захватывающей: (?<=_)([A-Z419] ?)(?:SUB|SUBS|FN)?(?=_)