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