You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Java Whois查询代码提取Registry Expiry Date行?

解决Java Whois查询中提取Registry Expiry Date的问题

问题根源分析

匹配失败通常有两个核心原因:一是Socket读取Whois响应时未获取完整内容,二是正则表达式未适配响应文本的格式细节。

修复步骤

1. 确保完整读取Whois响应

Socket单次读取可能无法获取全部返回内容,需循环读取直到流结束:

Socket socket = new Socket("whois.verisign-grs.com", 43);
OutputStream out = socket.getOutputStream();
out.write(("cnn.com\r\n").getBytes());
out.flush();

// 循环读取所有响应行
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
StringBuilder fullResponse = new StringBuilder();
while ((line = reader.readLine()) != null) {
    fullResponse.append(line).append("\n");
}

reader.close();
socket.close();
String whoisContent = fullResponse.toString();

2. 使用适配的正则表达式

Verisign返回的Registry Expiry Date行格式固定,正则需匹配冒号后的任意空格,以及标准ISO日期格式:

// 匹配完整行,同时捕获日期值
Pattern expiryPattern = Pattern.compile("Registry Expiry Date:\\s*(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z)");
Matcher matcher = expiryPattern.matcher(whoisContent);

if (matcher.find()) {
    String fullExpiryLine = matcher.group(0); // 获取完整的「Registry Expiry Date: 2026-09-21T04:00:00Z」行
    String expiryValue = matcher.group(1);    // 仅提取日期值
    System.out.println(fullExpiryLine);
} else {
    System.out.println("未找到Registry Expiry Date相关内容");
}

如果需要兼容大小写不敏感的场景,可在编译正则时添加Pattern.CASE_INSENSITIVE标志:

Pattern expiryPattern = Pattern.compile("registry expiry date:\\s*(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z)", Pattern.CASE_INSENSITIVE);

内容的提问来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:45:56