模式编译器和匹配器中的组

时间:2013-09-03 17:24:18

标签: java regex

所以我正在玩模式和匹配器中的组,当在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组时没有回来。

1 个答案:

答案 0 :(得分:3)

你的正则表达式搜索的是:

  • 一个或多个非空白字符,后跟
  • 一个或多个空格字符。

现在,它将在你的字符串中匹配两次:

  • 第一场比赛: [第2组 - Hello,第3组 - " "]
  • 第二场比赛: [第2组 - people,第3组 - " "]

它与yeah不匹配,因为它后面没有空格字符。所以,比赛失败了。

但是,如果您将正则表达式更改为 - ((\\S*)(\\s*)),它也会匹配yeah,因为\\s*现在匹配0个或更多的空白字符,因此将匹配0个空白字符太


与正则表达式分开的问题。使用简单的String#split()方法可以轻松解决此问题。您不需要Matcher和Pattern类。

String[] words = str.split("\\s+");

上面的代码将您的字符串拆分为一个或多个空格。你的数组现在包含所有三个单词。