当我跑步时:
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中测试正则表达式。
答案 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)
将包含前导空格。如果您对剩余字符也感兴趣,则必须添加另一个捕获组。