
本文介绍如何通过正则表达式精准提取形如 `mywebsite.de` 或 `mywebsite.co.uk` 的域名,要求匹配不受前后空格或无关文字干扰,同时支持多级域名,并提供可直接运行的 java 示例与关键注意事项。
在处理日志、搜索记录或用户输入文本时,常需从不规则上下文中提取结构化域名(如 Mywebsite.de)。观察示例可知:目标字符串始终以 Mywebsite. 开头,后接至少一个「字母+点+字母」的二级或三级域名(如 .de、.co.uk),且其前后可能为空格、中文、英文单词等非字母数字字符——因此不能依赖固定长度或简单贪婪匹配。
核心思路是:锚定 Mywebsite\. 字面量,后接灵活但受控的域名部分,并确保整体匹配独立于周边文本。原始代码 Mywebsite(.*?) 存在三个问题:
- 未转义点号 .(正则中 . 匹配任意字符,需写为 \.);
- (.*?) 过于宽泛,可能跨过空格捕获到后续无关内容;
- 缺少边界控制,无法防止匹配到 Mywebsite.xyzabc.de 等误匹配。
✅ 推荐正则表达式:
Mywebsite\.[a-z]+(?:\.[a-z]+)+
- Mywebsite\.:精确匹配字面量 Mywebsite.(注意反斜杠转义);
- [a-z]+:匹配一级域名(如 de、co),仅限小写字母;
- (?:\.[a-z]+)+:非捕获组,匹配一个或多个「点+小写字母序列」,支持 .co.uk、.com.cn 等多级域名;
- ⚠️ 若需兼容大写字母或数字(如 Mywebsite.COM 或 Mywebsite123.net),可改为 [a-zA-Z0-9]+,但需根据实际数据规范权衡。
以下是完整、健壮的 Java 实现(含空值与匹配失败防护):
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DomainExtractor {
// 预编译正则提高性能,支持多级小写字母域名(如 .co.uk, .org.cn)
private static final Pattern DOMAIN_PATTERN =
Pattern.compile("Mywebsite\\.[a-z]+(?:\\.[a-z]+)+");
public static String extractDomain(String input) {
if (input == null) return null;
Matcher matcher = DOMAIN_PATTERN.matcher(input);
return matcher.find() ? matcher.group() : null;
}
// 测试用例
public static void main(String[] args) {
String[] tests = {
"Search Mywebsite.de",
"Mywebsite.de durchsuchen",
"Search Mywebsite.co.uk",
"Mywebsite.co.uk something",
"No match here",
"Mywebsite.DE" // 注意:此例不匹配(大写),如需支持请改用 [a-zA-Z]
};
for (String test : tests) {
String result = extractDomain(test);
System.out.printf("Input: %-25s → Output: %s%n",
"\"" + test + "\"", result != null ? "\"" + result + "\"" : "null");
}
}
}? 关键注意事项:
- 转义不可省略:Java 字符串中反斜杠需双写(\\.),否则编译报错或逻辑错误;
- 边界增强(进阶):若上下文可能出现 Mywebsite.de.com 等嵌套情况,建议添加单词边界 \\bMywebsite\\.[a-z]+(?:\\.[a-z]+)+\\b,避免部分匹配;
- 国际化域名:如需匹配中文域名或 IDN(如 Mywebsite.中国),需启用 Unicode 字符类(\\p{L}+)并考虑 Punycode 转换;
- 性能提示:对高频调用场景,务必复用 Pattern 实例(如上例中的 static final),避免重复编译开销。
通过以上方案,您即可稳定、准确地从任意含空格/杂文本的字符串中提取目标域名,兼顾可读性、健壮性与扩展性。










