线程" main"中出现异常java.lang.IndexOutOfBoundsException:没有组1

时间:2016-01-04 09:44:12

标签: java regex

我有一个像这样的字符串

"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

4 个答案:

答案 0 :(得分:6)

您需要在正则表达式中添加capturing group。这是通过将您想要捕获的内容放在括号内来完成的:

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"
}

答案 1 :(得分:4)

您只有group (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”

答案 2 :(得分:0)

Pattern中没有捕获组:

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

有关详细信息,请参阅documentation of Pattern

我认为你需要这个:

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

答案 3 :(得分: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));
            }

      }
    }