2011-01-25 22 views
8

琐碎的正则表达式的问题(答案最有可能是针对Java):为什么这个正则表达式在Java中没有像预期的那样工作?

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

这返回false。据我所知,^意味着它总是意味着什么,并且#没有特别的意义,所以我会将^#翻译为字符串开头的“A'#”。应该匹配。所以它在Perl中有:

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

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

谢谢。

回答

17

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

由于您的正则表达式只匹配第一个字符,它会返回false

你会想用Matcher.find()来代替。

诚然,它可以是一个有点棘手找到具体的规范,但它的存在:

+0

这是正确的答案,谢谢。这是记录在某处吗?因为我无法从String.matches的文档中读到这个:“判断这个字符串是否与给定的正则表达式匹配。”听起来不像你所描述的那样。 – 0xCAFEBABE 2011-01-25 10:02:18

+0

我一直理解“匹配”来暗示“整个输入”,但我已经在上面添加了完整的解释(以及如何找到它)。 – 2011-01-25 10:11:12

+0

谢谢一堆。 – 0xCAFEBABE 2011-01-25 10:12:21

2

matches方法你对整个字符串的正则表达式匹配。

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

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

其返回true。人们甚至可以从正则表达式中删除所有的锚点(包括开始和结束),并且方法会为我们添加它。所以在上述情况下,我们也可以使用"#.*"作为正则表达式。

0

这应该符合您的期望:

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

现在输入字符串相匹配“的第一个字符应为#,其余的应是任何字符”


继Joachims评论中,以下是等效的:

"#This is a comment in a file".matches("#.*") 
相关问题