使用正则表达式查找没有特定单词模式的 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}\/).*$
解释:
^
- 断言 string/url 的开始
(?!.*\/[0-9A-F]{40}\/)
- Negative Lookahead 检查字符串中某处是否存在 /
后跟恰好 40 个十六进制字符后跟 /
。因为,这是一个否定的前瞻,任何包含这个模式的 string/url 都不会被匹配。
.*
- 匹配出现次数超过 0 次的除换行符以外的任何字符
$
- 断言字符串结束
我正在尝试编写一个可以匹配没有特定模式的 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}\/).*$
解释:
^
- 断言 string/url 的开始
(?!.*\/[0-9A-F]{40}\/)
- Negative Lookahead 检查字符串中某处是否存在/
后跟恰好 40 个十六进制字符后跟/
。因为,这是一个否定的前瞻,任何包含这个模式的 string/url 都不会被匹配。.*
- 匹配出现次数超过 0 次的除换行符以外的任何字符$
- 断言字符串结束