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

Use Regular Expressions to find URLs without certain word patterns

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

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

/dev/api/appid/A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5/users

/dev/api/apps/list

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

(url 是编造的,但想法是有些端点的 ID 长度为 40,有些端点没有,有些端点的总字符数非常长)

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

我写了下面的正则表达式,

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

它匹配其中确实具有长 ID 的端点,但会跳过应过滤的端点。如果我尝试否定正则表达式,

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

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

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

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

使用否定先行匹配任何连续没有 40 个十六进制数字的行。 Try it here.

试试这个正则表达式:

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

Click for Demo

解释:

  • ^ - 断言 string/url
  • 的开始
  • (?!.*\/[0-9A-F]{40}\/) - Negative Lookahead 检查字符串中某处是否存在 / 后跟恰好 40 个十六进制字符后跟 /。因为,这是一个否定的前瞻,任何包含这个模式的 string/url 都不会被匹配。
  • .* - 匹配出现次数超过 0 次的除换行符以外的任何字符
  • $ - 断言字符串结束