我想使用正则表达式验证 URL。以下是我验证 URL 的条件:
- 方案是可选的
- 应该允许子域
- 应该允许端口号
- 路径应该是允许的。
我正在尝试以下模式:
((http|https)://)?([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
但我没有得到想要的结果。即使是像 '*.example.com' 这样的无效 URL 也会被匹配。
它有什么问题?
你匹配整个字符串吗?你没有说你使用的是什么语言,但在 python 中,看起来你可能使用search
的是match
.
解决此问题的一种方法是从 regexp 开始^
并以$
.
虽然解析 URL 最好留给一个库(因为我最了解 perl,所以我建议使用类似http://search.cpan.org/dist/URI/之类的东西),如果您需要一些帮助来调试该语句,它可能是最好的在调试器中尝试,例如:http: //www.debuggex.com/。
我认为它匹配的主要原因之一是因为您不使用开始和结束字符串匹配标记。意思是,该字符串的任何部分都可能与您明确输入的内容不匹配,但是由于您没有使用字符串的开始和结束标记对其进行标记,因此您的正则表达式可能只是匹配字符串中的“example.com”,而不是整个输入。
在您的输入的帮助下找到了我的条件的正则表达式
^(http(s)?://)?[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$
以下代码在 c# 中对我有用
private static bool IsValidUrl(string url)
{
return new Regex(@"^(http|http(s)?://)?([\w-]+\.)+[\w-]+[.\w]+(\[\?%&=]*)?").IsMatch(url) &&!new Regex(@"[^a-zA-Z0-9]+$").IsMatch(url);
}
它允许带有或不带有 http(s) 和 www 的“something.anything”(期间后至少 2 个)。