空格不匹配

时间:2013-02-21 16:00:26

标签: java regex space

当我跑步时:

String line = "  test";
Pattern indentationPattern = Pattern.compile("^[\\s]+");
Matcher indentationMatcher = indentationPattern.matcher(line);

if (indentationMatcher.matches()) {
    System.out.println("Got match!");

    int indent = indentationMatcher.group(0).length();
    System.out.println("Size of match: " + indent);
} else {
    System.out.println("No match! :(");
}

我得不到比赛。这里发生了什么?我在http://www.regexplanet.com/advanced/java/index.html在线测试了正则表达式,它似乎专门用于在Java中测试正则表达式。

3 个答案:

答案 0 :(得分:6)

更改了一些内容,请参阅评论:

String line = "  test";
Pattern indentationPattern = Pattern.compile("^(\\s+)"); // changed regex
Matcher indentationMatcher = indentationPattern.matcher(line);

if (indentationMatcher.find()) {   // used find() instead of matches()
    System.out.println("Got match!");

    int indent = indentationMatcher.group(1).length(); // group 1 instead of 0
    System.out.println("Size of match: " + indent);
} else {
    System.out.println("No match! :(");
}

输出:

Got match!
Size of match: 2

上述变化的原因:

find()尝试在输入中找到模式,并在找到时给出true。也可以多次使用while (matcher.find()) { ... }来查找输入中的所有匹配项。

matches()尝试将完整输入与模式匹配,并在完整输入与正则表达式匹配时仅提供true

整个模式是第0组,第一个捕获组()的内容是第1组。在这种情况下,没有区别,因为在捕获组之外,只有行的开头{{ 1}},长度/宽度为0。

答案 1 :(得分:1)

Matcher#matches 自动锚定给定的模式,这意味着首先"^[\\s]+""[\\s]+"完全相同。因此,要匹配您的输入,只需使用"[\\s]+.*"

答案 2 :(得分:1)

Matcher.matches()尝试匹配整个字符串,但您的模式只匹配空格而没有其他内容。试试

Pattern indentationPattern = Pattern.compile("(\\s+).*")

代替。如果模式匹配,则group(1)将包含前导空格。如果您对剩余字符也感兴趣,则必须添加另一个捕获组。