0

所以我在模式和匹配器中使用组,当在模式编译器中处理多个正则表达式时,有一个我不理解的特定组调用。

这是它。

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);
        }

如您所见,我必须在编译器中进行正则表达式,第一个查找非空格,第二个查找空格。

现在据我所知,第 0 组是整个表达式,第 1 组是 ((\S+)(\s+)) 第 2 组是/应该是这个 (\S+),第 3 组是 (\s+)

但是,当我打电话给第 2 组时,我得到了 Hello people

但不是,这很奇怪,因为如果编译器只有 ("\S+") 我会得到你好人是的

所以是的,我真的不明白为什么当我打电话给第 2 组时没有返回是的。

4

1 回答 1

3

您的正则表达式正在搜索的是:

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

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

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

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

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


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

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

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

于 2013-09-03T17:27:03.653 回答