/ / java.lang.IndexOutOfBoundsException: Немає групи 1 | Відповідність шаблону - Java, регулярний вираз, Scala

java.lang.IndexOutOfBoundsException: Немає групи 1 | Зразки збігу - 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)

Я думаю, що я роблю щось неправильно у своєму регулярному виразі абоу вхідному рядку є кілька незаконних символів, які я не можу ідентифікувати зі своїми обмеженими знаннями про регулярний вираз. Допоможіть мені з’ясувати причину.

Відповіді:

5 за відповідь № 1

Радимо не використовувати (ab) використання оглядки, якщо можливо написати таку, що не зрозуміло, і робить те саме.

Просто використовуйте шаблон:

version=(.*)

І те, що ви хочете, буде в групі 1 захоплення.


1 для відповіді № 2

Код використовує твердження lookbehind:

(?<=version=)

Це не фіксується як група. Якщо ви хочете захопити version= як групу, використовуйте групу захоплення:

(version=)

Отримати 1.1 з заданого рядкового введення використовуйте такий регулярний вираз:

(?<=version=)(.*)

0 для відповіді № 3

Оточіть частину, яку потрібно захопити, дужками, щоб створити групу (насправді, це не обов’язково у вашому випадку, оскільки вам потрібна вся область відповідності):

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

Потім скористайтеся matcher.group() (без параметра) для повернення 1.1 для прикладу введення.

Зверніть увагу, що ви повинні телефонувати matcher.find() перед використанням matcher.group().

matcher.group(x) буде працювати, лише якщо ваш регулярний вираз відповідає цілий рядок введення


0 для відповіді № 4

Це код, який ви шукаєте ...

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 відповідно до вашої потреби.