验证网址并匹配空字符串的正则表达式?

4
当前的表达式验证一个Web地址(HTTP),我该如何更改它,使得空字符串也可以匹配?
(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?

我从你的问题中没有想到你是在匹配文本文件中的行...我认为你可能是在解析HTTP响应的HTML,以找到其中的链接,并且在阅读你选定的答案之前无法理解你“空字符串”目标的上下文。不同的思考方式,嗯? - Hardryv
如果对于像我一样浏览网页中嵌入HTML的URL有所帮助的话,我构建的最佳匹配字符串是"((http)s?://)([\w.-](/)?)(#[\w.-])?"。我已经在多个流行网站上测试过它,并且它也将包含URL末尾的页面类搜索标签。 - Hardryv
4个回答

7
如果你想修改表达式来匹配空字符串完整的URL,你需要使用锚元字符^和$(分别匹配行的开头和结尾)。
^(|https?:\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)$

正如dirkgently指出的那样,你可以稍微简化一下协议的匹配,因此我也为你包含了这个内容。
但是,如果你正在程序或脚本中使用这个表达式,使用语言自身的手段检查输入是否为空可能更简单。
// in no particular language...
if input.length > 0 then
    if input matches <regex> then
        input is a URL
    else
        input is invalid
else
    input is empty

因为您是唯一提到必须使用 ^ 和 $ 的人,没有这两个符号,仅添加 ? 就无法匹配任何模式,所以被接受为答案。谢谢! - Peter Morris

2
将整个表达式括在括号中,并将其标记为可选项(“?”量词,无或一次重复)。
((http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)?

1
使用表达式标记^$将其放在表达式周围,并在末尾添加|^$。这样,您就可以使用|或运算符来显示两个不同的匹配情况,从而实现更好的匹配效果。
^(https?:\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)$|^$

这里的关键是,|^$ 表示“或匹配空白字符”。
另外,如果你使用模板字符串,在 JavaScript 中只有这个表达式才能起作用。

谢谢,虽然我不再需要这个,但我喜欢你的回答! - Peter Morris

0

Expr? 其中 Expr 是您的 URL 匹配器。就像我为 httphttps 所做的一样:https?? 被称为量词 -- 您可以查找它。来自 Wikipedia

? 问号表示前面的元素有零个或一个。


这是一个很棒的名字DG,没有DA的世界变得更加缺少了。 - Hardryv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接