"main" 线程出现异常:java.lang.IndexOutOfBoundsException: 没有第一组。

4
我有一个像这样的字符串
"abc:def"

我需要检查它是否匹配。如果是,则希望应用正则表达式并检索其第一部分("abc")。

这是我的尝试:

Pattern pattern = Pattern.compile(".*:.*");
String  name = "abc:def"
Matcher matcher = pattern.matcher(name);

if (matcher.find()) {
    String group = matcher.group(1);
    System.out.println(group);
}

我遇到了问题

线程 "main" 中发生异常:java.lang.IndexOutOfBoundsException:没有第 1 组


1
你正在检查 .*:.* 这个正则表达式,它只会匹配一组,因为其只能在文本中出现一次。尝试使用 group(0) 看看效果。 - SomeJavaGuy
阅读此处文档:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group(int) - Aaditya Gavandalkar
4个回答

6

您需要在正则表达式中添加一个捕获组。这可以通过将要捕获的内容放在括号内来实现:

Pattern pattern = Pattern.compile("(.*):.*"); // <-- parentheses here
String  name = "abc:def";
Matcher matcher = pattern.matcher(name);

if (matcher.find()) {
    String group = matcher.group(1);
    System.out.println(group); // prints "abc"
}

虽然这并没有回答提问者的问题。 - Neijwiert
1
@Neijwiert 实际上,OP 没有提供问题,只是一个任务和一个异常。 - SomeJavaGuy
@KevinEsche 好的,没错,但看起来他正在尝试解决他的异常。我并不是说我不同意这个答案。 - Neijwiert
@Neijwiert 我不明白。这将解决异常。 - Tunaki

4
您只有一个组(0)(完全匹配),因为在您的正则表达式中没有定义任何捕获组(用括起来)。
如果您像这样更改代码以包含捕获组,则可以:
Pattern pattern = Pattern.compile("([^:]*):.*"); 
String  name = "abc:def";
Matcher matcher = pattern.matcher(name);

if (matcher.find()) {
    String fullMatch = matcher.group(0);
    String group = matcher.group(1);
    System.out.println(group);
}

你将会得到完整匹配的字符串 "abc:def" 和第一个分组(直到第一个冒号)"abc"。

0

你的 Pattern 中没有捕获组:

Pattern pattern = Pattern.compile(".*:.*");

请查看Pattern文档以获取更多详细信息。

我猜您需要这个:

Pattern pattern = Pattern.compile("(.*):.*");

0

试试这个:

 import java.util.regex.Pattern;
import java.util.regex.Matcher;



    public class HelloWorld
    {
      public static void main(String[] args)
      {
          String patternString = ".*:.*";

         Pattern pattern = Pattern.compile(patternString);
         String  name = "abc:def";
         Matcher matcher = pattern.matcher(name);

         while(matcher.find()) {
                System.out.println("found: " + matcher.group(0));
            }

      }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接