我有一个奇怪的String.matches行为:
requestString.matches(".*")
(boolean) false
而requestString类似于
“HTTP / 1.1 200 OK - 确定
[...]
Content-Type:text / xml;字符集= ISO-8859-1
内容长度:1545“
+更多...
原因,我想测试“HTTP / \\ d \\。\\ d 但很明显,这使得战士失败: requestString.matches( “HTTP / \\ d \\。\\ d”)
requestString中的String通过Socket连接进入,并以iso-8859-1编码发送。这是代码,
StringBuilder result = new StringBuilder();
int ch;
while ( ! timeoutExceeded() && (ch = reader.read()) != -1) {
result.append((char)ch);
}
String requestString = result.toString()
代码在android sdk上运行。 我错过了什么?编码是问题吗?
解决方案: 感谢提示我尝试了DotAll标志(再次!)并且它可以工作:
requestString.matches("(?s).*HTTP/\\d\\.\\d.*")
答案 0 :(得分:2)
首先,请参阅here。
其次,默认情况下,点不匹配换行符。由于您的输入是多行的,这意味着正则表达式无法匹配。
您必须使用Pattern
并使用Pattern.DOTALL
进行编译:
final Pattern p = Pattern.compile(".*", Pattern.DOTALL);
p.matcher(anything).matches(); // always returns true
插图:
public static void main(final String... args)
{
final String input = "a\nb";
System.out.println(input.matches(".*"));
System.out.println(Pattern.compile(".*", Pattern.DOTALL)
.matcher(input).matches());
}
结果:
false
true
答案 1 :(得分:1)
matches
必须匹配整个字符串,因为您尝试匹配多行字符串,您的模式与完整字符串不匹配
例如
System.out.println("HTTP/1.1 200 OK - OK".matches(".*")); //true
System.out.println("HTTP/1.1 200 OK - OK\nContent-Type: text/xml".matches(".*")); // false