正则表达式:检查重复组是否至少包含一次字母
Regexp: check if repeated group contains a letter at least once
我正在学习正则表达式,并且有一个任务是创建一个表达式来验证 URL(我有一个特定的 URL 列表,这些 URL 必须验证并且必须失败)。这是我目前拥有的
^((https?:\/\/)(?=.*[A-Za-z]+.*)(([A-Za-z0-9]+\-*[A-Za-z0-9]+|[A-Za-z0-9])\.){1,}([A-Za-z]+)\/?$)
在所有其他 URL 中,这些 URL 必须验证:
http://1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa
http://0test.com/
但是这些肯定会失败:
http://1234567890123456789012345678901234567890123456789012345678901234.com
http://0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.com
他们一定是失败了,因为他们在域名中没有字母(只有在顶级域名中),我不知道如何排除他们。
我添加了一个积极的前瞻:
(?=.*[A-Za-z]+.*)
我希望它只会检查以下重复组:
(([A-Za-z0-9]+\-*[A-Za-z0-9]+|[A-Za-z0-9])\.){1,}
但它检查整个表达式直到结束,即它也检查顶级域名。我该如何解决?
您的想法是对的,但是,正如您所说,您不希望超前考虑顶级域名。因此,在您的展望中包含该匹配项的副本:
(?=.*[A-Za-z]+.*\.([A-Za-z]+)$\/?)
^-------- will match the top level domain
^ will ensure its the last part of the domain
我还将你的 A-z
更改为 A-Za-z
(不确定是否有拼写错误,但提醒你 A-z
不仅匹配字母)
编辑:向后看不起作用,因为它不允许可变大小的匹配。为可能的 /
结尾
添加了 \/?
我认为这个断言会让你过得更好
(?=.*[A-Za-z]+.*\.[A-Za-z]+/?$)
使用它和一些重构,这个原始正则表达式验证和无效
样本中的正确项目。
^(https?://)(?=.*[A-Za-z]+.*\.[A-Za-z]+/?$)((?:[A-Za-z0-9]+(?:-+[A-Za-z0-9]+)?\.)+)([A-Za-z]+)/?$
^
( https?:// ) # (1)
(?= .* [A-Za-z]+ .* \. [A-Za-z]+ /? $ )
( # (2 start)
(?:
[A-Za-z0-9]+
(?:
-+
[A-Za-z0-9]+
)?
\.
)+
) # (2 end)
( [A-Za-z]+ ) # (3)
/?
$
我正在学习正则表达式,并且有一个任务是创建一个表达式来验证 URL(我有一个特定的 URL 列表,这些 URL 必须验证并且必须失败)。这是我目前拥有的
^((https?:\/\/)(?=.*[A-Za-z]+.*)(([A-Za-z0-9]+\-*[A-Za-z0-9]+|[A-Za-z0-9])\.){1,}([A-Za-z]+)\/?$)
在所有其他 URL 中,这些 URL 必须验证:
http://1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa
http://0test.com/
但是这些肯定会失败:
http://1234567890123456789012345678901234567890123456789012345678901234.com
http://0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.com
他们一定是失败了,因为他们在域名中没有字母(只有在顶级域名中),我不知道如何排除他们。
我添加了一个积极的前瞻:
(?=.*[A-Za-z]+.*)
我希望它只会检查以下重复组:
(([A-Za-z0-9]+\-*[A-Za-z0-9]+|[A-Za-z0-9])\.){1,}
但它检查整个表达式直到结束,即它也检查顶级域名。我该如何解决?
您的想法是对的,但是,正如您所说,您不希望超前考虑顶级域名。因此,在您的展望中包含该匹配项的副本:
(?=.*[A-Za-z]+.*\.([A-Za-z]+)$\/?)
^-------- will match the top level domain
^ will ensure its the last part of the domain
我还将你的 A-z
更改为 A-Za-z
(不确定是否有拼写错误,但提醒你 A-z
不仅匹配字母)
编辑:向后看不起作用,因为它不允许可变大小的匹配。为可能的 /
结尾
\/?
我认为这个断言会让你过得更好
(?=.*[A-Za-z]+.*\.[A-Za-z]+/?$)
使用它和一些重构,这个原始正则表达式验证和无效
样本中的正确项目。
^(https?://)(?=.*[A-Za-z]+.*\.[A-Za-z]+/?$)((?:[A-Za-z0-9]+(?:-+[A-Za-z0-9]+)?\.)+)([A-Za-z]+)/?$
^
( https?:// ) # (1)
(?= .* [A-Za-z]+ .* \. [A-Za-z]+ /? $ )
( # (2 start)
(?:
[A-Za-z0-9]+
(?:
-+
[A-Za-z0-9]+
)?
\.
)+
) # (2 end)
( [A-Za-z]+ ) # (3)
/?
$