#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)?(?=_)