Java Pattern Matcher匹配HTTP响应码失败求助
问题排查与解决:Java正则匹配HTTP响应码失败
嘿,我来帮你搞定这个问题~
你遇到的核心问题是**Matcher.matches()方法的行为特性**:这个方法要求整个输入字符串必须完全匹配正则表达式才会返回true,而你的正则([0-9][0-9][0-9])只能匹配纯三位数字的字符串,显然和你的输入"HTTP/1.1 400 Bad Request"不匹配,所以返回false是正常的。
下面给你两种解决方案:
方案1:修改正则,适配整个字符串匹配
调整正则表达式,让它能匹配完整的HTTP响应头格式,同时捕获中间的三位响应码。可以用这个正则:
String regex = "^HTTP/\\d+\\.\\d+ (\\d{3}) .+$";
解释一下各部分的作用:
^:匹配字符串的开头HTTP/:匹配固定的协议前缀\\d+\\.\\d+:匹配版本号(比如1.1、2.0等)(\\d{3}):捕获三位数字的响应码(这是你要的分组).+$:匹配响应码后面的所有内容直到字符串结尾
修改后的方法调用就能正常返回400了。
方案2:改用Matcher.find()方法
如果你不想修改正则,也可以把matches()换成find()方法。find()的作用是在输入字符串中查找任意位置的匹配子串,不需要整个串完全匹配。修改后的代码如下:
private static String getSubString(String regex, String data ) { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(data); if(matcher.find()) { // 这里换成find() return matcher.group(1); } return null; }
这样用原来的正则"([0-9]{3})"(或者简化成"(\\d{3})")就能成功捕获到400了。
另外小提示:\\d和[0-9]是等价的,用\\d{3}可以简化你原来的三位数字写法哦~
内容的提问来源于stack exchange,提问作者Fishingfon
相关产品推荐
相关产品推荐

