【Java】正则匹配 http和 https

目录

1. 问题

2. URL 格式定义

3. 理解

4. 常见格式

5. 参考


1. 问题

写代码过程中有时候需要使用正则匹配,匹配url 更复杂的场景还没有写出来,放一个简单的匹配http/https 的,如下所示:

    public String getUrl(String text) {
        //noinspection RegExpRedundantEscape
//        Pattern p = Pattern.compile("((http|https)://)(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\\&%_\\./-~-]*)?", Pattern.CASE_INSENSITIVE);
        Pattern p = Pattern.compile("((http[s]{0,1})://)(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\\&%_\\./-~-]*)?", Pattern.CASE_INSENSITIVE);
        Matcher matcher = p.matcher(text);
        boolean isMatcher = matcher.find();
        if (isMatcher) {
            return matcher.group();
        }
        return "";
    }

正则表达式为:

// Pattern.CASE_INSENSITIVE 忽略 US-ASCII Charset 大小写
((http[s]{0,1})://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\&%_\./-~-]*)?

2. URL 格式定义

protocol://host[:port]/path/[;parameters][?query]#fragment

一般我们使用如下方式:

protocol://host[:port]/path[?query]

举例:

https://blog.csdn.net/DovSnier/article/details/103424638?status=edit&os=windows

3. 理解

((http[s]{0,1})://)    (?# 分组`$1` ,重复匹配 `http` 或 `https` 0次到1次,后面带着`://`)
(    (?# 分组`$2`,匹配 `host` 部分)
	([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})
	|
	([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})
)
(:[0-9]{1,4})*    (?# 分组`$3`,匹配 `[:port]` 部分)
(/[a-zA-Z0-9\\&%_\\./-~-]*)?    (?# 分组`$4`,匹配 `/path` 部分)
  1. 分组`$1`,重复匹配`http`或`https` 0次到1次,后面带着`://`,即`http://`或`https://` 格式的;
  2. 分组`$2`,匹配`host` 部分,但是我觉得`([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})` 这部分不靠谱,此处应该针对数字+字母格式的域名,如果应用场景是匹配IP 地址的话,那这部分是不对的;
  3. 分组`$3`,匹配`[:port]` 部分,按照这个匹配规则,那网络端口区间就是[1,9999]
  4. 分组`$4`,匹配`/path` 部分

这个只是匹配http/https 的情况,那如果匹配通用的URL 呢? 显然这个是不适用的;

后续如果有此类需求了则提供通用的URL 看着还可以的规则;

后来折腾了半天,一上网看 https://tool.oschina.net/regex,然后点击了常用正则表达式选项,次哦,原来都有了;

匹配URL 地址:

[a-zA-z]+://[^\s]*

发现人家写的比我自己写的简单明了多了;

4. 常见格式

我也学别人,有常见的就记录下来,以便不时之需;

用户名:/^[a-z0-9_-]{3,16}$/
密码:/^[a-z0-9_-]{6,18}$/
十六进制值:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/
电子邮箱:/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/ 或者 /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/
URL:/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
IP地址:/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/ 或者 /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
HTML标签:/^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/
删除代码\\注释:(?<!http:|\S)//.*$
Unicode编码中的汉字范围:/^[\u2E80-\u9FFF]+$/

5. 参考

  1. 正则表达式手册;
  2. https://www.ietf.org/rfc/rfc2396.txt;
  3. https://www.ietf.org/rfc/rfc2732.txt;
  4. java.net.URL;
  5. https://tool.oschina.net/regex;
发布了66 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/DovSnier/article/details/103424638
今日推荐