我有下一个代码:
public static void createTokens(){
String test = "test is a word word word word big small";
Matcher mtch = Pattern.compile("test is a (\s*.+?\s*) word (\s*.+?\s*)").matcher(test);
while (mtch.find()){
for (int i = 1; i <= mtch.groupCount(); i++){
System.out.println(mtch.group(i));
}
}
}
并有下一个输出:
word
w
但在我看来,它必须是:
word
word
有人请解释我为什么会这样?
因为你的模式是非贪婪的,所以它们匹配尽可能少的文本,同时仍然由匹配项组成。
删除第二组中的 ?,您将获得
词
字 字 大 小
Matcher mtch = Pattern.compile("test is a (\s*.+?\s*) word (\s*.+\s*)").matcher(test);
通过使用\s*
它将匹配任意数量的空格,包括 0 个空格。 w
比赛(\s*.+?\s*)
. 要确保它与用空格分隔的单词匹配,请尝试(\s+.+?\s+)