/ / रेगेक्स मैच से सभी समूहों को अनपैक करें - रेगेक्स, स्कैला

रेगेक्स मैच से सभी समूहों को अनपैक करें - रेगेक्स, स्कैला

Regex से मिलान समूहों को अनपैक करने का एक बहुत अच्छा तरीका है:

scala> val regex = "(first):(second)".r
regex: scala.util.matching.Regex = (first):(second)

scala> val regex(a, b) = "first:second"
a: String = first
b: String = second

दुर्भाग्यवश, जब कोई मिलान नहीं होता है तो यह अपवाद फेंकता है:

scala> val regex(a, b) = "first:third"
scala.MatchError: first:third (of class java.lang.String)
at .<init>(<console>:10)
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)

इस मामले में मैं उपयोग कर सकता था findFirstMatchIn लेना None क्या कोई मैच नहीं है:

scala> val result = regex.findFirstMatchIn("first:third")
result: Option[scala.util.matching.Regex.Match] = None

लेकिन मैच के मामले में, मैं अनपॅकिंग के साथ पहले संस्करण के रूप में कुछ अच्छा करना चाहता हूं। अब मुझे इससे निपटना होगा:

scala> val result = regex.findFirstMatchIn("first:second")
result: Option[scala.util.matching.Regex.Match] = Some(first:second)

मैं इसके साथ क्या आया यह है:

scala> val content = result.get
content: scala.util.matching.Regex.Match = first:second

scala> 1 to content.groupCount map content.group
res0: scala.collection.immutable.IndexedSeq[String] = Vector(first, second)

क्या रेगेक्स मैच ऑब्जेक्ट से सभी समूहों को प्राप्त करने का कोई बेहतर तरीका है (आदर्श रूप में इस प्रश्न में पहले कोड स्निपेट में अनपॅकिंग के रूप में संक्षेप में)?

उत्तर:

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

वे साथ आए थे Groups उसके लिए:

scala> regex findFirstMatchIn "first:second" map { case Regex.Groups(a,b) => (a,b) }
res8: Option[(String, String)] = Some((first,second))

मुझे लगता है कि "अब जैसा ही है:

scala> regex findFirstMatchIn "first:second" map { case regex(a,b) => (a,b) }
res9: Option[(String, String)] = Some((first,second))

चूंकि यह मैच को पुन: सम्मिलित नहीं करता है।


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

आप पैटर्न मिलान का उपयोग कर सकते हैं

इसके साथ कुछ (अवांछित)

val regex = "(first):(second)".r
val myString = "first:second"
myString  match {
case regex(first, second) => do something
case _ => None
}