我的 String.matches 有一个非常奇怪的行为:
requestString.matches(".*")
(boolean) false
而 requestString 类似于
"HTTP/1.1 200 OK - OK
[...]
Content-Type: text/xml; Charset=iso-8859-1
Content-Length: 1545"
+ more...
当然,我想针对“HTTP/\\d\\.\\d”进行测试 但显然这失败了八个: requestString.matches("HTTP/\\d\\.\\d")
requestString 中的字符串通过 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.*")
最佳答案
首先,参见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
关于java - String.matches 每次测试都失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17104012/