/ / java.lang.IndexOutOfBoundsException: कोई समूह 1 | पैटर्न मिलान - जावा, रेगेक्स, स्काला

java.lang.IndexOutOfBoundsException: कोई समूह 1 | पैटर्न मिलान - जावा, रेगेक्स, स्कैला

मैं संस्करण के मूल्य को निकालने की कोशिश कर रहा हूं 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)

मुझे लगता है कि मैं अपने regex या में कुछ गलत कर रहा हूंइनपुट स्ट्रिंग में कुछ अवैध अध्याय हैं, जिन्हें मैं नियमित अभिव्यक्ति के अपने सीमित ज्ञान के साथ पहचान नहीं पा रहा हूं। इसका कारण जानने में मेरी मदद करें।

उत्तर:

जवाब के लिए 5 № 1

यह लुक-बैक का उपयोग करते हुए (अब) के खिलाफ सलाह देता है, अगर यह स्पष्ट है कि एक के बिना लिखना संभव है और वही काम करता है।

बस पैटर्न का उपयोग करें:

version=(.*)

और जो आप चाहते हैं वह समूह 1 को कैप्चर करने में होगा।


उत्तर № 2 के लिए 1

कोड मुखरता का उपयोग कर रहा है:

(?<=version=)

वह समूह के रूप में कैप्चर नहीं किया गया है। यदि आप कब्जा करना चाहते हैं version= एक समूह के रूप में, कैप्चरिंग समूह का उपयोग करें:

(version=)

लेना 1.1 दिए गए स्ट्रिंग इनपुट से, नियमित अभिव्यक्ति के बाद उपयोग करें:

(?<=version=)(.*)

जवाब के लिए 0 № 3

उस हिस्से को घेरें जिसे आप कोष्ठक के साथ समूह बनाना चाहते हैं (वास्तव में, यह आपके मामले में वैकल्पिक है क्योंकि आप संपूर्ण मिलान चाहते हैं)

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

फिर उपयोग करें matcher.group() (कोई पैरामीटर नहीं) वापस करने के लिए 1.1 अपने उदाहरण इनपुट के लिए।

ध्यान दें कि आपको कॉल करना होगा matcher.find() उपयोग करने से पहले matcher.group().

matcher.group(x) केवल तभी काम करेगा जब आपका regexp मिलान करता है संपूर्ण इनपुट स्ट्रिंग।


जवाब के लिए 0 № 4

यह यू कोड की तलाश है ...

शून्य संस्करणफ़िंडर () {

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

}

आप उर जरूरत के अनुसार रीगेक्स बदल सकते हैं।