使用正则表达式查找没有特定格式的URL
我正在尝试编写一个正则表达式,它可以匹配没有特定格式的URL。我尝试过滤的网址不应包含ID,即40个十六进制大写字符。使用正则表达式查找没有特定格式的URL
例如,如果我有以下网址:
/dev/api/appid/A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5/users
/dev/api/apps/list
/dev/api/help/apps/applicationname/apple/osversion/list/
(网址是编造的,但这个想法是有一些端点与40长ID和一些端点,以及一些端点在总字符中的确很长)
我想确保正则表达式只能匹配最后2个URL,而不是第一个。
我写了下面的正则表达式,
\S+(?:[0-9A-F]{40})\S+
,并匹配做在他们长ID终点,而是跳过应当被过滤掉的人。如果我试图否定的正则表达式,
\S+(?![0-9A-F]{40})\S+
它的所有端点相匹配,因为一些网址的长度是比什么ID应该是(40个字符)更大。
如何使用正则表达式来过滤掉我需要的网址?
试试这个正则表达式:
^(?!.*\/[0-9A-F]{40}\/).*$
说明:
-
^
- 断言字符串的开始/ URL -
(?!.*\/[0-9A-F]{40}\/)
- Negative Lookahead检查是否存在/
后跟正好40个HEX字符,然后是字符串中某处的/
。因为,它是一个负面的向前看,任何包含这种模式的字符串/网址将不会匹配。 -
.*
- 比赛0+除换行符 -
$
任意字符的出现 - 断言字符串
^((?![A-F0-9]{40}).)*$
使用负前瞻匹配不具有连续40个十六进制数字的任何行。 Try it here.
真棒,是完美工作的结束。我稍微将它改为 '^((?![A-F0-9] {40})\ S)* $' 因为不应该有空格。 – iamseiko
谢谢,解释帮助很大。到目前为止,消极的向前看是最难理解的东西。 – iamseiko