
本文讲解如何用正则表达式精准匹配并提取形如 `mywebsite.xx` 或 `mywebsite.co.uk` 的域名,自动忽略前后空格、无关单词等干扰内容。
在实际文本处理中,我们常需从非结构化语句中提取特定格式的域名(如 Mywebsite.de、Mywebsite.co.uk),但目标字符串前后往往存在空格、动词、本地化词汇(如德语 “durchsuchen”)等干扰项。此时,仅靠简单贪婪匹配(如 "Mywebsite(.*?)")不仅无法正确捕获完整后缀,还容易因未转义点号(.)导致误匹配——因为正则中 . 是元字符,代表“任意字符”,而非字面量的英文句点。
✅ 正确做法是:
- 严格转义域名中的点号:写成 \.,确保只匹配真实的 .;
- 精确限定顶级域和二级域结构:例如 ([a-z]+\.[a-z]+) 可匹配 de、co.uk 等常见形式(注意:对更复杂 TLD 如 .com.cn 或国际化域名需进一步扩展);
- 利用完整匹配而非子组拼接:避免手动拼接 "Mywebsite" + group(1),直接捕获整个域名更安全、可读性更高。
推荐正则表达式:
Mywebsite\.[a-z]+\.[a-z]+
该模式能准确命中 Mywebsite.de、Mywebsite.co.uk,且天然跳过前导/尾随空格(因空格不参与匹配,matcher.find() 会自动定位到首个合法匹配位置)。
以下是完整、健壮的 Java 示例代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DomainExtractor {
private static final Pattern DOMAIN_PATTERN =
Pattern.compile("Mywebsite\\.[a-z]+(?:\\.[a-z]+)?"); // 支持 .xx 和 .xx.yy
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"
};
for (String test : tests) {
System.out.println("\"" + test + "\" → " + extractDomain(test));
}
}
}? 注意事项:
- 使用 \\. 双反斜杠(Java 字符串中需转义反斜杠);
- ?: 非捕获分组提升性能;? 使 .[a-z]+ 可选,兼容 .de 和 .co.uk;
- 若需支持大小写字母、数字或连字符(如 Mywebsite2-test.co.uk),可将 [a-z] 改为 [a-zA-Z0-9-] 并注意 TLD 规范;
- 生产环境建议预编译 Pattern(如示例中的 static final),避免重复编译开销。
通过以上方法,即可稳定、高效地从任意含杂文本中提取目标域名,无需依赖前后空格或固定位置。










