Используйте регулярные выражения для поиска URL без определенных шаблонов слов
Я пытаюсь написать регулярное выражение, которое может соответствовать URL, которые не имеют определенного шаблона. У URL, которые я пытаюсь отфильтровать, не должно быть идентификатора, который состоит из 40 шестнадцатеричных заглавных символов.
Например, если у меня есть следующие URL:
/dev/api/appid/A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5/users
/dev/api/apps/list
/dev/api/help/apps/applicationname/apple/osversion/list/
(URL составлены, но идея в том, что есть некоторые конечные точки с идентификаторами длиной 40, и некоторые конечные точки, которые этого не делают, и некоторые конечные точки, которые действительно длинные в общем количестве символов)
Я хочу убедиться, что регулярное выражение может соответствовать только двум последним URL-адресам, а не первому.
Я написал следующее регулярное выражение,
\S+(?:[0-9A-F]{40})\S+
и это соответствует конечным точкам, которые имеют длинный идентификатор в них, но пропускает те, которые должны быть отфильтрованы. Если я попытаюсь опровергнуть регулярное выражение,
\S+(?![0-9A-F]{40})\S+
Он соответствует всем конечным точкам, потому что некоторые URL-адреса имеют длину, превышающую значение идентификатора (40 символов).
Как я могу использовать регулярное выражение для фильтрации именно тех URL, которые мне нужны?
2 ответа
Попробуйте это регулярное выражение:
^(?!.*\/[0-9A-F]{40}\/).*$
Объяснение:
^
- утверждает начало строки / URL(?!.*\/[0-9A-F]{40}\/)
- Отрицательный Lookahead, чтобы проверить наличие/
затем ровно 40 символов HEX с последующим/
где-то в строке Поскольку это негативный взгляд, любая строка / URL, содержащая этот шаблон, не будет сопоставлена..*
- соответствует 0+ вхождений любого символа, кроме символа новой строки$
- утверждает конец строки
^((?![A-F0-9]{40}).)*$
Использует отрицательный прогноз, чтобы соответствовать любой строке, в которой нет 40 шестнадцатеричных цифр подряд. Попробуй это здесь.