Я намагаюся витягти значення версії з 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 відповідно до вашої потреби.