Регулярное выражение, чтобы соответствовать всем подпапкам URL, кроме нескольких специальных
Хорошо, я пишу регулярное выражение, которое я хочу сопоставить с определенным путем URL-адреса и всеми подпапками под ним, но с некоторыми исключениями. для контекста, это для использования внутри Verizon Edgecast, который является системой кэширования CDN. он поддерживает регулярные выражения, но, к сожалению, я не знаю "вкус" регулярных выражений, которые он поддерживает, и документация также не ясно об этом. Кажется, поддерживает все основные функции регулярных выражений, и это должно быть все, что мне нужно. к сожалению, для чтения документации необходима учетная запись, но вы можете получить общее представление о edgecast здесь: https://www.verizondigitalmedia.com/platform/edgecast-cdn/
Итак, вот некоторые примеры данных:
help
help/good
help/better
help/great
help/bad
help/bad/worse
и вот регулярное выражение, которое я использую прямо сейчас:
(^help$|help\/[^bad].*)
ссылка: https://regex101.com/r/CBWUDE/1
сломано:
( - start capture group
^ - start of string
help - 1st thing that should match
$ - end of string
| - or
help - another thing that should match
\/ - escaped / so i can match help/
[^bad] - match any single character that isn't b, a, or d
. - any character
* - any number of times
) - end capture group
Я хотел бы, чтобы первые 4 соответствовали, но не последние 2, "плохо" или "плохо / хуже" не должны совпадать, а help/ everythingelse должно совпадать
это регулярное выражение работает для меня, за исключением того, что помощь / лучше не совпадает. Я уверен, что причина не в совпадении, потому что лучше, содержит символ, который появляется внутри "плохо". если я поменяю 'лучше' на 'получатель', то это становится совпадением, потому что в нем больше нет ab.
так что я действительно хочу, чтобы мои "плохие" соответствовали только всему слову "плохое", и не соответствовали никаким вещам с b, a или d. Я попытался использовать границу слова, чтобы сделать это, но не дает мне нужных результатов, но, возможно, у меня просто неправильный синтаксис, вот что я попробовал:
(^help$|help\/[^\bbad\b].*)
но, похоже, не работает, "плохие" URL больше не исключаются, и help/ better все еще не соответствует этому. Я думаю, что это потому, что / не является границей слова. Я уверен, что моя проблема с оригинальным регулярным выражением заключается в части:
[^bad] - соответствует любому отдельному символу, который не является b, a или d
мой вопрос, как я могу превратить [^bad] во что-то, что соответствует чему-либо, что не содержит полной строки 'bad'?
1 ответ
Вы будете хотеть использовать отрицательный взгляд вперед (?! Плохой) вместо отрицания определенных букв [^ плохо]
Я думаю (^help$|help\/(?!bad).*) Это то, что вы ищете
Редактировать: если вы имеете в виду что-либо со словом "плохой", а не просто "справка / плохой", вы можете сделать это (?!.* Плохо. *). Это может помешать вам, например, сопоставить справку / матбадтом. Полное регулярное выражение: (^help$|help\/(?!.* Плохо. *). *)