String.matches每次测试都失败了吗?

时间:2013-06-14 08:14:56

标签: java regex string

我有一个奇怪的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.*")

2 个答案:

答案 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