为什么这个正则表达式在Java中没有像预期的那样工作?

琐碎的正则表达式问题(答案很可能是特定于Java的):

"#This is a comment in a file".matches("^#") 

这返回false。 据我所知, ^表示它总是意味着什么, #没有特殊含义,所以我将^#翻译为字符串开头的“A”#’。 哪个应该匹配。 在Perl中它确实如此:

 perl -e "print '#This is a comment'=~/^#/;" 

打印“1”。 所以我很确定答案是Java特有的。 有人请赐教吗?

谢谢。

Matcher.matches()检查整个输入字符串是否与正则表达式匹配。

由于正则表达式只匹配第一个字符,因此返回false

你会想要使用Matcher.find()

当然,找到具体的规范可能有点棘手,但它在那里:

  • String.matches()被定义为与Pattern.matches(regex, str)做同样的事情。
  • Pattern.matches()依次定义为Pattern.compile(regex).matcher(input).matches()
    • Pattern.compile()返回一个Pattern
    • Pattern.matcher()返回一个Matcher
  • Matcher.matches()记录如下(强调我的):

    尝试将整个区域与模式匹配。

matches方法将您的正则表达式与整个字符串相匹配。

因此,尝试添加.*以匹配其余字符串。

 "#This is a comment in a file".matches("^#.*") 

返回true 。 甚至可以从正则表达式中删除所有锚点(开始和结束), match方法将为我们添加它。 所以在上面的例子中我们也可以使用"#.*"作为正则表达式。

这应该符合您的期望:

 "#This is a comment in a file".matches("^#.*$") 

现在输入String匹配模式“First char应为# ,其余为char”


根据Joachims的评论,以下内容是等效的:

 "#This is a comment in a file".matches("#.*")