如何使用正则表达式验证域名

下面是一篇关于如何使用正则表达式验证域名的教程。


如何使用正则表达式验证域名

简介

域名是互联网上网站的地址,每个域名由多个标签(label)组成,标签之间用点 . 分隔。域名规则有很多细节,但基本要求是:

  1. 每个标签只能包含字母、数字和短横线 -。
  2. 标签的长度不能超过 63 个字符。
  3. 域名的最后一部分(即顶级域名,TLD)必须由字母组成,且至少为 2 个字符。

在本文中,我们将学习如何使用正则表达式来验证域名是否合法。

正则表达式分析

我们可以使用以下正则表达式来验证域名格式是否正确:

regex 复制代码
^(?:[a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,}$
解释
  1. ^ 和 $:

    • ^:表示匹配字符串的开始。
    • $:表示匹配字符串的结束。通过这两个符号,我们可以确保整个字符串符合正则表达式的规则。
  2. (?: ... ):

    • 这是一个非捕获组,用于将一组元素组合在一起,但是不会把它们单独捕获用于后续的处理。这里的非捕获组用于重复匹配标签部分。
  3. [a-zA-Z0-9-]{1,63}:

    • [a-zA-Z0-9-]:表示标签部分可以包含小写字母、大写字母、数字和短横线 -。
    • {1,63}:表示每个标签的长度应在 1 到 63 个字符之间。
  4. \.:

    • \. 用于匹配点 .。由于点在正则表达式中有特殊意义(表示任何单个字符),所以我们使用反斜杠对它进行转义。
  5. +:

    • + 表示前面的模式(即标签部分和点)可以重复多次,表示域名可以有多个标签部分。
  6. [a-zA-Z]{2,}:

    • [a-zA-Z]:表示顶级域名(TLD)部分只可以包含字母。
    • {2,}:表示顶级域名的长度必须至少为 2 个字符。

合法的域名示例

以下是一些合法的域名,正则表达式应当能够匹配:

  • example.com
  • www.example.com
  • subdomain.example.co
  • my-website.example.org

不合法的域名示例

以下是一些不合法的域名,正则表达式会排除:

  • example..com ------ 双点 .. 不合法
  • -example.com ------ 域名标签不能以短横线 - 开头
  • example-.com ------ 域名标签不能以短横线 - 结尾
  • .example.com ------ 域名不能以点 . 开头
  • example ------ 没有顶级域名部分(缺少点)
  • example.c ------ 顶级域名长度小于 2 个字符
  • example.123 ------ 顶级域名不能包含数字

使用 Java 正则表达式进行域名验证

在 Java 中,我们可以使用 Pattern 类和 Matcher 类来编写一个方法来验证域名。以下是 Java 实现:

java 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DomainValidator {
    // 域名验证正则表达式
    private static final String DOMAIN_REGEX = "^(?:[a-zA-Z0-9-]{1,63}\\.)+[a-zA-Z]{2,}$";

    // 验证域名是否合法
    public static boolean isValidDomain(String domain) {
        // 创建模式对象
        Pattern pattern = Pattern.compile(DOMAIN_REGEX);
        // 创建匹配器对象
        Matcher matcher = pattern.matcher(domain);
        // 返回是否匹配
        return matcher.matches();
    }

    // 测试方法
    public static void main(String[] args) {
        // 测试合法域名
        System.out.println(isValidDomain("example.com"));  // true
        System.out.println(isValidDomain("www.example.com"));  // true
        System.out.println(isValidDomain("subdomain.example.co"));  // true
        System.out.println(isValidDomain("my-website.example.org"));  // true

        // 测试不合法域名
        System.out.println(isValidDomain("example..com"));  // false
        System.out.println(isValidDomain("-example.com"));  // false
        System.out.println(isValidDomain("example-.com"));  // false
        System.out.println(isValidDomain(".example.com"));  // false
        System.out.println(isValidDomain("example"));  // false
        System.out.println(isValidDomain("example.c"));  // false
        System.out.println(isValidDomain("example.123"));  // false
    }
}
解释:
  1. 正则表达式 :我们将正则表达式 DOMAIN_REGEX 定义为常量,以便在 Java 代码中使用。
  2. isValidDomain 方法 :该方法接收一个字符串参数 domain,并使用 Pattern.compile() 方法编译正则表达式,再使用 matcher.matches() 来验证输入的字符串是否符合域名格式。
  3. main 方法 :测试了多个合法和不合法的域名,以验证 isValidDomain() 方法的正确性。

总结

通过本教程,你已经学会了如何使用正则表达式来验证域名格式。我们编写了一个正则表达式,确保域名符合基本的规则:每个标签只能包含字母、数字和短横线,标签长度限制在 1 到 63 个字符之间,且顶级域名必须由字母组成且长度至少为 2 个字符。

我们还使用 Java 的 Pattern 和 Matcher 类实现了一个域名验证方法,并对合法和不合法的域名进行了测试。

希望这篇教程对你有所帮助!


相关推荐
代码山河2 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行2 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
梯度下降者3 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
“AI国潮设计-小江”4 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
benchmark_cc5 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读5 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python
Decay__6 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
外收内放6 小时前
Python基础语法练习题(73)
java·前端·python
锋行天下6 小时前
Langgraph HITL 中断运行,用户输入后输出打字效果
人工智能·python
时早玖沐7 小时前
给 AstrBot 写一个天气推送插件:12 次提交、6 个坑
python·开源·ai编程