使用正则表达式查找没有特定格式的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}\/).*$

Click for Demo

说明:

  • ^ - 断言字符串的开始/ URL
  • (?!.*\/[0-9A-F]{40}\/) - Negative Lookahead检查是否存在/后跟正好40个HEX字符,然后是字符串中某处的/。因为,它是一个负面的向前看,任何包含这种模式的字符串/网址将不会匹配。
  • .* - 比赛0+除换行符
  • $任意字符的出现 - 断言字符串
+0

谢谢,解释帮助很大。到目前为止,消极的向前看是最难理解的东西。 – iamseiko

^((?![A-F0-9]{40}).)*$ 

使用负前瞻匹配不具有连续40个十六进制数字的任何行。 Try it here.

+0

真棒,是完美工作的结束。我稍微将它改为 '^((?![A-F0-9] {40})\ S)* $' 因为不应该有空格。 – iamseiko