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

Java String.matches每次测试都失败吗?,java,regex,string,Java,Regex,String,我有一个非常奇怪的字符串行为。匹配: requestString.matches(".*") (boolean) false 而requestString类似于 “HTTP/1.1200正常-正常 […] 内容类型:text/xml;字符集=iso-8859-1 内容长度:1545“+更多 当然,我想测试“HTTP/\\d\\.\\d” 但很明显,这是失败的: requestString.matches(“HTTP/\\d\\.\\d”) requestString中的字符串通过套接字

我有一个非常奇怪的字符串行为。匹配:

requestString.matches(".*")
    (boolean) false
而requestString类似于

“HTTP/1.1200正常-正常
[…]
内容类型:text/xml;字符集=iso-8859-1
内容长度:1545“
+更多

当然,我想测试“HTTP/\\d\\.\\d” 但很明显,这是失败的: requestString.matches(“HTTP/\\d\\.\\d”)

requestString中的字符串通过套接字连接输入,并以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.*")

匹配
必须匹配整个字符串,并且由于您试图匹配多行字符串,因此您的模式与整个字符串不匹配

例如


匹配
必须匹配整个字符串,并且由于您试图匹配多行字符串,因此您的模式与整个字符串不匹配

例如

首先,请看

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

您必须使用
模式
并使用
模式进行编译。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
首先,请看

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

您必须使用
模式
并使用
模式进行编译。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

注意,
.matches()
尝试将正则表达式应用于整个输入!这是一个巨大的陷阱…请不要在问题中发布答案。答案应该作为答案发布,然后选择一个作为您接受的答案。这样我们就知道您的问题已经完成。我知道,@shyam太快了,stackoverflow没有接受我接受他的答案:)小心
 .matches()
尝试将正则表达式应用于整个输入!这是一个巨大的陷阱…请不要在问题中发布答案。答案应该作为答案发布,然后选择一个作为您的接受答案。这样我们就知道您的问题已经完成。我知道,@shyam太快了,stackoverflow没有接受我接受他的答案:)这就完成了:requestString.MATCHS(“(?s)。*HTTP/\\d\\\.\\d.*”)这样做了:requestString.MATCHS((?s)。*HTTP/\\d\\\.\\d.*)