【问题标题】:String.matches fails every test?String.matches 每次测试都失败?
【发布时间】:2013-06-14 08:14:56
【问题描述】:

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

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

而 requestString 类似于

"HTTP/1.1 200 OK - OK
[...]
内容类型:文本/xml;字符集=iso-8859-1
内容长度: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.*")

【问题讨论】:

  • 注意.matches() 尝试将正则表达式应用于整个输入!这是一个巨大的陷阱......
  • 请不要在问题中发布答案。答案应作为答案发布,然后选择一个作为您接受的答案。这样我们就知道您的问题得到了满足。
  • 我知道,@shyam 太快了,stackoverflow 不接受我接受他的回答 :)

标签: java regex string


【解决方案1】:

首先,请参阅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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 这样做了:requestString.matches("(?s).*HTTP/\\d\\.\\d.*")
    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多