如何用正则匹配HTTP头指定字段后的行尾日期时间?
解决HTTP头Date/Last-Modified字段的日期提取问题
首先来说说你原来的正则为什么没生效:
- 你用
BufferedReader.readLine()读取的每一行,是不包含末尾换行符的,所以正则里的(?=\n)这个正向断言根本匹配不到内容,这是核心问题。 - 另外这个正则只能匹配
Date字段,没法复用在Last-Modified上,有点浪费。
给你两个实用的解决方案,按需选择:
方案一:通用正则(同时兼容两个字段)
这个正则可以同时匹配Date和Last-Modified行,并且鲁棒性更强:
^(Date|Last-Modified):\s*(.*)$
正则解释:
^:匹配行的开头,确保我们只匹配整行的字段(避免行内意外出现字段名的情况)(Date|Last-Modified):匹配两个目标字段中的任意一个:\s*:匹配冒号,以及后面的任意数量空格(HTTP头允许冒号后有多个空格,用\s*比\s更灵活)(.*):捕获冒号空格之后的所有内容,也就是我们需要的日期字符串$:匹配行尾,确保不会捕获到多余的内容
Java代码示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class HttpHeaderDateExtractor { public static void main(String[] args) { String dateLine = "Date: Mon, 27 Jul 2009 12:28:53 GMT"; String lastModifiedLine = "Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT"; // 编译正则,加上CASE_INSENSITIVE可以兼容大小写不同的字段名(比如date:、LAST-MODIFIED:) Pattern pattern = Pattern.compile("^(Date|Last-Modified):\\s*(.*)$", Pattern.CASE_INSENSITIVE); // 提取Date字段值 Matcher matcher = pattern.matcher(dateLine); if (matcher.matches()) { String extractedDate = matcher.group(2); System.out.println("提取的Date: " + extractedDate); } // 提取Last-Modified字段值 matcher = pattern.matcher(lastModifiedLine); if (matcher.matches()) { String extractedLastModified = matcher.group(2); System.out.println("提取的Last-Modified: " + extractedLastModified); } } }
方案二:单个字段的简化正则
如果你只想单独处理某个字段,可以去掉换行符断言,比如针对Date的正则:
(?<=Date:\s).*
或者针对Last-Modified:
(?<=Last-Modified:\s).*
这个方案更简单,但需要为每个字段单独写正则,灵活性不如方案一。
额外注意事项
- HTTP头的字段名是大小写不敏感的,如果你的场景中可能出现小写或混合大小写的字段名(比如
date:、last-modified:),记得给正则加上Pattern.CASE_INSENSITIVE标志。 - 有些服务器返回的头可能在冒号后有多个空格,用
\s*代替\s可以完美适配这种情况。
内容的提问来源于stack exchange,提问作者Fishingfon
相关产品推荐
相关产品推荐

