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.*)