/ / java.lang.IndexOutOfBoundsException: Keine Gruppe 1 | Pattern Matching - Java, Regex, Scala

java.lang.IndexOutOfBoundsException: Keine Gruppe 1 | Mustervergleich - Java, Regex, Scala

Ich versuche, den Wert der Version von zu extrahieren Accept Header, der von der Form sein kann

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

Hier ist mein Code zum Extrahieren der Version

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

Wenn ich die obige Funktion aufrufe, die zum Extrahieren der Version bestimmt ist (zum Beispiel kann sie die Form v1.0 oder v1.5 oder v2.5 haben)

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

Ich bekomme folgende Ausnahme:

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)

Ich denke, ich mache etwas falsch in meinem Regex oderDie Eingabezeichenfolge enthält einige unzulässige Zeichen, die ich mit meinen begrenzten Kenntnissen des regulären Ausdrucks nicht identifizieren kann. Hilf mir, den Grund herauszufinden.

Antworten:

5 für die Antwort № 1

Es wird davon abgeraten, einen Blick hinter die Kulissen zu werfen, wenn es möglich ist, einen zu schreiben, ohne dass dies klar ist und dasselbe tut.

Verwenden Sie einfach das Muster:

version=(.*)

Und was Sie wollen, wird in Gruppe 1 erfassen.


1 für die Antwort № 2

Der Code verwendet Lookbehind Assertion:

(?<=version=)

Das wird nicht als Gruppe erfasst. Wenn Sie erfassen möchten version= Verwenden Sie als Gruppe die Erfassungsgruppe:

(version=)

Bekommen 1.1 Verwenden Sie aus der angegebenen Zeichenfolge den folgenden regulären Ausdruck:

(?<=version=)(.*)

0 für die Antwort № 3

Umgeben Sie den Teil, den Sie erfassen möchten, mit Klammern, um eine Gruppe zu erstellen (in Ihrem Fall ist dies optional, da Sie den gesamten übereinstimmenden Bereich benötigen):

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

Dann benutze matcher.group() (ohne Parameter) zurückzugeben 1.1 für Ihre Beispieleingabe.

Beachten Sie, dass Sie anrufen müssen matcher.find() vor Gebrauch matcher.group().

matcher.group(x) funktioniert nur, wenn Ihr regulärer Ausdruck dem entspricht ganz Eingabezeichenfolge


0 für die Antwort № 4

Dies ist der Code, den du suchst ...

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

}

Sie können den regulären Ausdruck nach Bedarf ändern.