所以我正在玩模式和匹配器中的组,当在Pattern编译器中处理多个正则表达式时,有一个我不理解的特定组呼。
就是这样。
Pattern p=Pattern.compile("((\\S+)(\\s+))");
Matcher m=p.matcher("Hello people yeah");
while (m.find()){
String line=m.group(2);
System.out.println("First match is "+line);
}
因为你可以看到我必须在编译器中使用regex,第一个查找非空格,第二个查找空格。
现在据我所知,组0是整个表达式,组1是((\ S +)(\ s +)) 第2组/应该是(\ S +),第3组是(\ s +)
然而,当我打电话给第2组时,我得到了 你好 人
但不是,这是奇怪的,因为如果编译器只是(“\ S +”),我会得到 你好 人 耶
所以是的,我真的不明白为什么在我打电话给第2组时没有回来。
答案 0 :(得分:3)
你的正则表达式搜索的是:
现在,它将在你的字符串中匹配两次:
Hello
,第3组 - " "
] people
,第3组 - " "
] 它与yeah
不匹配,因为它后面没有空格字符。所以,比赛失败了。
但是,如果您将正则表达式更改为 - ((\\S*)(\\s*))
,它也会匹配yeah
,因为\\s*
现在匹配0个或更多的空白字符,因此将匹配0个空白字符太
与正则表达式分开的问题。使用简单的String#split()
方法可以轻松解决此问题。您不需要Matcher和Pattern类。
String[] words = str.split("\\s+");
上面的代码将您的字符串拆分为一个或多个空格。你的数组现在包含所有三个单词。