如何修改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
相关产品推荐
相关产品推荐

