java.lang.IndexOutOfBoundsException:没有组1 |模式匹配

时间:2014-01-31 15:48:44

标签: java regex scala

我正在尝试从Accept标题中提取版本的值,其格式可以是

"vnd.example-com.foo+json; version=1.1" 

这是我提取版本的代码

val resourceVersionPattern: Pattern = Pattern.compile("(?<=version=).*")

def getResourceVersion(acceptHeader: String): String = {
            import java.util.regex.Matcher
            val matcher: Matcher = resourceVersionPattern.matcher(acceptHeader)
            if(matcher.find()) ("v" + matcher.group(1)).trim() else "v1.0"
    }

当我调用上述用于提取版本的函数时(例如可以是v1.0或v1.5或v2.5的形式)

 getResourceVersion("vnd.example-com.foo+json; version=1.1")

我得到以下例外:

java.lang.IndexOutOfBoundsException: No group 1
at java.util.regex.Matcher.group(Matcher.java:487)
at .getResourceVersion(<console>:12)
at .<init>(<console>:11)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
at java.lang.Thread.run(Thread.java:744)

我认为我在我的正则表达式中做错了,或者输入字符串有一些非法的字符,我无法用我对正则表达式的有限知识来识别。帮我找出原因。

4 个答案:

答案 0 :(得分:5)

如果有可能在没有明确的情况下写一个并且做同样的事情,那么建议不要使用旁视,(ab)。

只需使用模式:

version=(.*)

你想要的是捕捉第1组。

答案 1 :(得分:1)

代码使用了lookbehind断言:

(?<=version=)

这不是作为一个群体捕获的。如果您想将捕获version=作为一个组,请使用捕获组:

(version=)

要从给定的字符串输入中获取1.1,请使用以下正则表达式:

(?<=version=)(.*)

答案 2 :(得分:0)

使用括号环绕要捕获的部分以创建组(实际上,由于您需要整个匹配区域,因此在您的情况下这是可选的):

Pattern.compile("(?<=version=)(.*)")

然后使用matcher.group()(不带参数)返回1.1作为示例输入。

请注意,在使用matcher.find()之前,您必须先致电matcher.group()

matcher.group(x)仅在您的正则表达式匹配整个输入字符串时才有效。

答案 3 :(得分:0)

这是您正在寻找的代码......

void versionFinder() {

    String version = "vnd.example-com.foo+json; version=1.1";
    String regex = "(?<=(version=))(\\d((\\.)(\\d)+)?)";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(version);
    int i=0;

    while (m.find()) {

        System.out.println(i+"-----------"+m.group() +"-------"+m.start());
        int j = m.start();
        String printable ="";
        while(j!=version.length() && version.charAt(j)!=' ')
                    {
            printable+=version.charAt(j);
            j++;
        }
        printable="v"+printable;
        System.out.println(printable);
        i++;
    }

}

您可以根据需要更改\ d后的正则表达式。