为什么这个正则表达式在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("#.*")