使用正则表达式查找没有特定字模式的URL

时间:2017-10-20 20:31:38

标签: regex regex-negation regex-lookarounds

我正在尝试编写一个可以匹配没有特定模式的URL的正则表达式。我试图过滤掉的网址中不应包含ID,即40个十六进制大写字符。

例如,如果我有以下网址:

/dev/api/appid/A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5/users

/dev/api/apps/list

/dev/api/help/apps/applicationname/apple/osversion/list/

(网址已经完成,但我们的想法是有一些端点有40个长度的ID,有些端点没有,有些端点的总字符数很长)

我想确保正则表达式只能匹配最后2个网址,而不是第一个网址。

我写了以下正则表达式,

\S+(?:[0-9A-F]{40})\S+

并且它匹配具有长ID的端点,但跳过应该过滤的端点。如果我试图否定正则表达式,

\S+(?![0-9A-F]{40})\S+

它匹配所有端点,因为某些URL的长度大于ID应该的长度(40个字符)。

如何使用正则表达式精确过滤出我需要的网址?

2 个答案:

答案 0 :(得分:1)

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

使用负前瞻来匹配任何行中没有40个十六进制数字的行。 Try it here.

答案 1 :(得分:1)

试试这个正则表达式:

^(?!.*\/[0-9A-F]{40}\/).*$

Click for Demo

<强>解释

  • ^ - 断言字符串/ url的开头
  • (?!.*\/[0-9A-F]{40}\/) - Negative Lookahead检查是否存在/后跟正好40个十六进制字符,后跟/字符串中的某个位置。因为,它是一个负前瞻,任何包含此模式的字符串/网址都不会匹配。
  • .* - 匹配除换行符之外的任何字符的出现次数
  • $ - 断言字符串的结尾