你能解读这个正则表达式吗?

时间:2011-03-07 00:44:09

标签: regex

我正在尝试阅读其他人的代码,我遇到了这段正则表达式。任何人都可以告诉作者试图做什么?

if(str.matches("^\\s*$") && !str.matches("^\\s*#.*")) {
       // do something
}

5 个答案:

答案 0 :(得分:4)

第一个正则表达式匹配任何仅包含空白字符的行(例如空格和制表符)。

^ -- start of line
\\s -- interpolated to \s, a blank character
* -- any number of
$ -- end of line

第二个正则表达式似乎是多余的,因为它匹配以哈希开头的行,不包括前导空格。无论如何,这样的行与第一个正则表达式不匹配。

更新:我的猜测是作者打算否定第一个正则表达式。对于看起来不像评论的行,这会运行if的正文。

答案 1 :(得分:3)

第一个模式寻找一个空行 - 一行只包含空格(空格,制表符等)。

第二个模式查找以空格开头,后跟#(哈希)的行,并忽略它们。

这很奇怪;任何与第一个正则表达式匹配的东西都不匹配第二个正则表达式,所以第二个测试是没有意义的。有意义的是,测试应该是:

if (!str.matches("^\\s*$") && !str.matches("^\\s*#.*")) {
       // do something with non-blank, non-comment lines
}

或者:

if (str.matches("^\\s*$") || str.matches("^\\s*#.*")) {
       // do something with all blank or all comment lines (like ignore them)
}

答案 2 :(得分:2)

如果字符串仅由空格组成,则第一个正则表达式返回true。第二个检查它不是一个带有#的字符串(之前是空格,后面是随机的东西),但这种情况从未发生,因为字符串只包含空格。这看起来像个错误......

答案 3 :(得分:1)

这只检查一个完全由空格(或空字符串)组成的字符串。第二个正则表达式不起作用,因为与第一个正则表达式匹配的任何字符串都不匹配第二个正则表达式。

答案 4 :(得分:1)

str.matches("^\\s*$")表示“字符串为空或仅包含空格”,!str.matches("^\\s*#.*")表示“字符串与某些前导空格不匹配,后跟#,后跟0或更多其他字符“,基本上就是说”字符串没有前导#字符“。