У меня есть список строк. Некоторые из них имеют форму 123-...456
. Переменная часть "..." может быть:
- строка «яблоко», за которой следует дефис, например
123-apple-456
- строка «банан» с последующим дефисом, например
123-banana-456
- пустая строка, например
123-456
(обратите внимание, что есть только один дефис)
Любое слово, кроме «яблоко» или «банан», является недействительным.
Для этих трех случаев я бы хотел сопоставить «яблоко», «банан» и «» соответственно. Обратите внимание, что я никогда не хочу захватывать дефис, но я всегда хочу соответствовать ему. Если строка не имеет форму, 123-...456
описанную выше, тогда совпадения не будет.
Как мне написать регулярное выражение для этого? Предположим, у меня есть аромат, который позволяет группам «смотреть вперед», «смотреть назад», «смотреть вокруг» и «не захватывать».
Ключевое наблюдение здесь заключается в том, что когда у вас есть «яблоко» или «банан», у вас также должен быть конечный дефис, но вы не хотите, чтобы он соответствовал. И когда вы сопоставляете пустую строку, у вас не должно быть завершающего дефиса. Я думаю, правильное выражение, которое заключает в себе это утверждение, будет правильным.
Ответы:
Единственный способ не запечатлеть что-либо - использование проверочных утверждений :
Потому что даже с не захватывающими группами
(?:…)
все регулярное выражение захватывает их совпадающее содержимое. Но это регулярное выражение соответствует толькоapple
илиbanana
если ему предшествует123-
и следует-456
, или оно соответствует пустой строке, если ему предшествует123-
и сопровождается456
.источник
Обновление: благодаря Херману Родригесу Эррере!
В javascript попробуйте:
/123-(apple(?=-)|banana(?=-)|(?!-))-?456/
Помните, что результат в группе 1
Debuggex Demo
источник
Пытаться:
Это будет соответствовать
apple
,banana
или пустая строка, и после нее будет 0 или 1 дефис. Я ошибался из-за того, что не нуждался в группе захвата. Я такой глупый.источник
Я изменил один из ответов (автор @ op1ekun):
Причина в том, что ответ @ op1ekun также совпадает
"123-apple456"
, без дефиса после яблока.источник
Попробуй это:
источник
apple
илиbanana
или "". Все остальные значения недействительны, как я уже говорил.Вариант выражения @Gumbo, который используется
\K
для сброса позиций совпадений, чтобы предотвратить включение блоков чисел в совпадение. Используется в PCRE регулярных выражениях.Спички:
источник
Безусловно самое простое (работает для python)
'123-(apple|banana)-?456'
.источник
123-apple456
так что это не правильно.