目录
1. 问题
2. URL 格式定义
3. 理解
4. 常见格式
5. 参考
1. 问题
写代码过程中有时候需要使用正则匹配,匹配url 更复杂的场景还没有写出来,放一个简单的匹配http/https 的,如下所示:
public String getUrl(String text) {
//noinspection RegExpRedundantEscape
// Pattern p = ("((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 = ("((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 = (text);
boolean isMatcher = ();
if (isMatcher) {
return ();
}
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]
举例:
/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`,重复匹配`http`或`https` 0次到1次,后面带着`://`,即`http://`或`https://` 格式的;
- 分组`$2`,匹配`host` 部分,但是我觉得`([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})` 这部分不靠谱,此处应该针对数字+字母格式的域名,如果应用场景是匹配IP 地址的话,那这部分是不对的;
- 分组`$3`,匹配`[:port]` 部分,按照这个匹配规则,那网络端口区间就是[1,9999];
- 分组`$4`,匹配`/path` 部分
这个只是匹配http/https 的情况,那如果匹配通用的URL 呢? 显然这个是不适用的;
后续如果有此类需求了则提供通用的URL 看着还可以的规则;
后来折腾了半天,一上网看 /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. 参考
- 正则表达式手册;
- /rfc/;
- /rfc/;
- ;
- /regex;