【Java】正则匹配 http和 https

本文深入探讨了使用正则表达式匹配URL的方法,包括HTTP/HTTPS的匹配规则,提供了多种格式的正则表达式用于匹配不同的URL结构,如用户名、密码、十六进制值等,并对比了不同规则的优劣。

 

目录

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.youkuaiyun.com/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;

 

 

 

 

 

 

 

<think> 首先,用户的问题是关于使用正则表达式匹配以 "http" 或 "https" 开头的字符串的方法。我需要根据系统级指令来回答。 系统级指令的关键点: - 所有行内数学表达式必须用 `$...$` 格式。 - 独立公式用 `$$...$$` 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如 [^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 - 用户可见层指令:回答结构清晰。 用户提供了几个引用: - 引用[1]:关于Java正则表达式,使用String.matches()进行简单匹配。 - 引用[2]:关于正则表达式概述。 - 引用[3]:关于使用 "^" 匹配字符串开头,在Python中的示例。 - 引用[4]:关于Python正则表达式匹配开头结尾。 - 引用[5]:一个示例匹配以指定字符串开头结尾的JSON。 用户说:"上述引用仅供参考,并不是用户真正的需求",所以我不能直接依赖于这些引用。我需要基于一般知识来回答。用户真正的问题是:"我想查找使用正则表达式匹配httphttps开头的字符串的方法"。 核心问题:正则表达式匹配以 "http" 或 "https" 开头的字符串。 在正则表达式中,匹配字符串开头的锚点是 "^"。所以,要匹配以 "http" 或 "https" 开头的字符串,表达式应该是:^https?:// 解释: - "^" 表示字符串的开头。 - "http" 是字面字符串。 - "s?" 表示 "s" 是可选的(0或1个),所以匹配 "http" 或 "https"。 - 通常,我们可能需要匹配完整的URL,所以添加 "://",但用户只指定了开头,所以我应该专注于开头部分。 用户说:"匹配httphttps开头的字符串",意思是整个字符串以 "http" 或 "https" 开头。所以,表达式是:^(http|https) 或者更简洁:^https? 因为 "s?" 表示 "s" 可选。 在正则表达式中,^https? 会匹配以 "http" 或 "https" 开头的字符串。但为了精确,可能需要在后面添加一些内容,但用户没有指定更多细节。 现在,回答结构: - 我需要结构清晰,逐步解决问题。 - 使用中文回答。 - 生成相关问题。 - 添加引用标识,但引用是提供的,所以我应该参考它们,但用户说它们仅供参考,所以我不能严重依赖它们。我可以自然地融入一些相关知识。 步骤: 1. **理解需求**:解释什么是匹配以特定字符串开头。 2. **正则表达式基础**:简要介绍 "^" 锚点的使用。 3. **具体表达式**:给出正则表达式:^https? 4. **解释表达式**:分解表达式的组成部分。 5. **代码示例**:提供在常见语言中的示例,如Python、Java等,基于引用。 6. **注意事项**:提醒可能的边缘情况。 7. **相关问题**:生成相关问题。 引用标识: - 在回答中,如果提到引用中的内容,添加引用标识。例如,引用[3]讨论了 "^" 的使用,所以我可以在提到 "^" 时引用它。 - 类似地,引用[1]是关于Java的,引用[4]是关于Python的。 最终回答结构: - 开头介绍。 - 步骤式说明。 - 代码示例。 - 相关问题。 生成相关问题: - 根据指令:"生成相关问题",在回答末尾添加相关问题。 - 例如: 1. 如何匹配以 "ftp" 开头的字符串? 2. 正则表达式如何匹配包含特定模式的字符串? 3. 在正则表达式中,如何处理大小写不敏感? 确保LaTeX:没有数学表达式,所以可能不需要LaTeX。如果有表达式,用行内格式如 `$^https?$`,但正则表达式通常不用LaTeX。系统指令说数学表达式用LaTeX,但正则表达式不是数学表达式,所以或许不需要。为了安全,我可以写成行内代码或直接文本。 在回答中,我会用代码块来显示正则表达式代码示例。 完整回答大纲: 1. 介绍问题:用户想匹配以 "http" 或 "https" 开头的字符串。 2. 解释正则表达式锚点 "^" 用于匹配开头。 3. 给出表达式:^https? 4. 解释:^ 表示开头,http 是字面,s? 表示可选的 s。 5. 提供语言示例: - Python:使用 re.match() 或 re.search() with "^" - Java:使用 Pattern and Matcher or String.matches() 6. 添加引用:提到参考了引用[3]关于 "^" 的使用。 7. 注意事项:如大小写敏感性,如果考虑,可以添加标志。 8. 生成相关问题。 </think> ### 使用正则表达式匹配以 "http" 或 "https" 开头的字符串 在正则表达式中,匹配字符串的开头需要使用锚点 `^`(脱字符),它指定模式必须从字符串的起始位置开始。对于您的需求——匹配以 "http" 或 "https" 开头的字符串,核心正则表达式为:`^https?`。下面我将逐步解释如何构建使用这个表达式,确保您能在不同编程语言中轻松实现。回答基于正则表达式通用原理,并参考了您提供的引用内容(如引用[3]关于 `^` 的使用)[^3]。整个过程结构清晰,您可以根据实际场景调整。 #### 步骤 1: 理解正则表达式结构 正则表达式 `^https?` 的组成部分: - `^`:锚点,表示匹配必须从字符串的开头开始(例如,`"http"` 必须在第一个字符位置)[^3]。 - `http`:字面字符串,必须精确匹配。 - `s?`:表示 "s" 是可选的(`?` 是量词,表示前一个字符出现 0 次或 1 次),因此它同时匹配 "http" "https"。 - 这个表达式只检查开头部分,不考虑字符串的结尾或其他内容。如果您需要完整匹配 URL,可以扩展表达式(如添加 `://`),但根据您的需求,专注于开头部分即可。 #### 步骤 2: 在常见编程语言中的实现示例 以下是具体代码示例,展示如何在 Python、Java 等语言中使用该正则表达式。所有示例都基于标准库,确保真实可靠。 ##### Python 示例 在 Python 中,使用 `re` 模块的 `match()` 或 `search()` 函数。`match()` 自动从字符串开头检查,适合您的需求。 ```python import re # 定义正则表达式:^https? pattern = re.compile(r'^https?') # 测试字符串 test_strings = ["http://example.com", "https://example.org", "abchttp://test.com", "HTTP://case-sensitive.com"] for s in test_strings: if pattern.match(s): # match() 从开头匹配 print(f"匹配成功: '{s}'") else: print(f"不匹配: '{s}'") ``` 输出: ``` 匹配成功: 'http://example.com' 匹配成功: 'https://example.org' 不匹配: 'abchttp://test.com' # 因为不是以 http/https 开头 不匹配: 'HTTP://case-sensitive.com' # 默认大小写敏感 ``` - **解释**:`re.match(r'^https?', s)` 会检查 `s` 是否以 "http" 或 "https" 开头。引用[3]中提到,`^` 确保匹配从字符串起始位置开始[^3]。如果需要大小写不敏感,添加 `re.IGNORECASE` 标志,如 `re.compile(r'^https?', re.IGNORECASE)`。 ##### Java 示例 在 Java 中,使用 `java.util.regex` 包的 `Pattern` `Matcher` 类,或 `String.matches()` 方法(引用[1]提到 `String.matches()` 适合简单匹配)[^1]。 ```java import java.util.regex.Pattern; import java.util.regex.Matcher; public class RegexExample { public static void main(String[] args) { // 定义正则表达式:^https? Pattern pattern = Pattern.compile("^https?"); // 测试字符串 String[] testStrings = {"http://example.com", "https://example.org", "abchttp://test.com", "HTTP://case-sensitive.com"}; for (String s : testStrings) { Matcher matcher = pattern.matcher(s); if (matcher.find()) { // 使用 find() 检查匹配 System.out.println("匹配成功: '" + s + "'"); } else { System.out.println("不匹配: '" + s + "'"); } } // 使用 String.matches() 的简化方式 String url = "https://example.org"; if (url.matches("^https?.*")) { // .* 允许后续任意字符 System.out.println("String.matches() 匹配成功: " + url); } } } ``` 输出: ``` 匹配成功: 'http://example.com' 匹配成功: 'https://example.org' 不匹配: 'abchttp://test.com' 不匹配: 'HTTP://case-sensitive.com' String.matches() 匹配成功: https://example.org ``` - **解释**:`Pattern.compile("^https?")` 创建一个模式,`matcher.find()` 检查是否匹配。引用[1] 推荐 `String.matches()` 用于快速验证,但注意 `matches()` 要求整个字符串匹配,所以添加 `.*` 以允许后续内容[^1]。 #### 步骤 3: 注意事项最佳实践 - **大小写敏感性**:默认情况下,正则表达式是大小写敏感的(如 "HTTP" 不会匹配)。如果需忽略大小写,添加标志: - Python: `re.compile(r'^https?', re.IGNORECASE)` - Java: `Pattern.compile("^https?", Pattern.CASE_INSENSITIVE)` - **性能考虑**:对于简单匹配,`^https?` 效率高,因为它只扫描开头部分。在大量数据处理中,避免复杂模式。 - **边界情况**:如果字符串可能为空或包含特殊字符,测试边缘场景(如空字符串或非字母字符)。表达式 `^https?` 会安全返回不匹配。 - **扩展应用**:如果需要匹配完整 URL,表达式可扩展为 `^https?://`(添加 `://`)。引用[4]讨论了匹配开头结尾的模式,类似思路[^4]。 #### 相关问题 基于您的查询,我生成了以下相关问题,帮助您深入探索: 1. 如何使用正则表达式匹配以 "ftp" 或 "sftp" 开头的字符串? 2. 在正则表达式中,如何同时匹配字符串的开头结尾(例如,确保 URL 以 ".com" 结束)? 3. 正则表达式如何处理大小写不敏感的匹配(如忽略 "HTTP" vs "http")? 4. 如何优化正则表达式性能,避免在大型文本中造成延迟? 如果您提供更多细节(如具体编程语言或匹配上下文),我可以进一步优化解答
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值