Java正则表达式在匹配时返回false

Java正则表达式在匹配时返回false,java,Java,我基本上是在尝试过滤以.ack.gz结尾的文件名 e、 g.String filename=“somefile.ack.gz” 其中一个不应该匹配吗?不确定这里遗漏了什么…匹配返回true指定的正则表达式匹配整个目标字符串。如果表达式只匹配字符串的一部分,则不会返回true。因此,要使用匹配,您需要提供一个匹配整个文件名的表达式。在您的情况下,这将是: return filename.matches(".*\\.ack\\.gz"); returns false 表达式前

我基本上是在尝试过滤以.ack.gz结尾的文件名

e、 g.String filename=“somefile.ack.gz”


其中一个不应该匹配吗?不确定这里遗漏了什么…

匹配
返回
true
指定的正则表达式匹配整个目标字符串。如果表达式只匹配字符串的一部分,则不会返回
true
。因此,要使用
匹配
,您需要提供一个匹配整个文件名的表达式。在您的情况下,这将是:

return filename.matches(".*\\.ack\\.gz");  returns false
表达式前面的
*
匹配字符串前面与表达式其余部分不匹配的任何内容,因此表达式将匹配整个目标字符串


您不需要
$
,因为表达式已经必须匹配字符串的结尾,因此它是多余的。

字符串.matches方法()测试正则表达式是否匹配整个目标字符串

但是在您的示例中,regex
“.ack.gz$”
“somefile.ack.gz”
的所有字符都不匹配。因此,match返回
false

如果您真的想使用正则表达式来实现这一点,那么您的代码应该是:

return filename.matches(".*\\.ack\\.gz");
注:

  • *
    与文件名的第一部分匹配
  • \\.
    表示匹配文本
    字符。如果没有转义,则
    匹配任何单个字符。需要双转义,因为模式被表示为Java字符串文本
  • 前面的
    ^
    和后面的
    $
    是不必要的。它们由
    match
    的语义暗示


  • 但是正如@kaya指出的,最好在这里使用
    String.endsWith
    (),因为这个测试不需要正则表达式功能。

    字符串与这些正则表达式都不匹配。包含
    $
    表明您希望测试字符串的一部分是否与正则表达式匹配,而
    不匹配的是
    测试。为什么不直接使用
    endsWith
    方法呢?在前面添加
    *
    应该会有帮助。最后的
    $
    是不必要的,因为
    matches
    将始终尝试匹配整个字符串。
    return filename.matches(".*\\.ack\\.gz");