0

我有一个非常奇怪的 String.matches 行为:

requestString.matches(".*")
    (boolean) false

而 requestString 类似于

“HTTP/1.1 200 OK - OK
[...]
Content-Type: text/xml; Charset=iso-8859-1
Content-Length: 1545”
+ 更多...

当然,我想针对 "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.*")
4

2 回答 2

2

首先,看这里

其次,默认情况下,点不匹配换行符。由于您的输入是多行的,这意味着正则表达式无法匹配。

您必须使用 aPattern并编译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
于 2013-06-14T08:20:30.800 回答
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
于 2013-06-14T08:17:59.037 回答