Регулярное выражение, чтобы соответствовать всем подпапкам 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\/(?!.* Плохо. *). *)

Другие вопросы по тегам