यहाँ निहित परिभाषा है कि आपके Regex
एक Parser
में धर्मान्तरित है:।
+०१२३५१६४१०६१
/** A parser that matches a regex string */
implicit def regex(r: Regex): Parser[String] = new Parser[String] {
def apply(in: Input) = {
val source = in.source
val offset = in.offset
val start = handleWhiteSpace(source, offset)
(r findPrefixMatchOf (source.subSequence(start, source.length))) match {
case Some(matched) =>
Success(source.subSequence(start, start + matched.end).toString,
in.drop(start + matched.end - offset))
case None =>
Failure("string matching regex `"+r+"' expected but `"+in.first+"' found", in.drop(start - offset))
}
}
}
बस इसे अनुकूलन:
object X extends RegexParsers {
/** A parser that matches a regex string and returns the Match */
def regexMatch(r: Regex): Parser[Regex.Match] = new Parser[Regex.Match] {
def apply(in: Input) = {
val source = in.source
val offset = in.offset
val start = handleWhiteSpace(source, offset)
(r findPrefixMatchOf (source.subSequence(start, source.length))) match {
case Some(matched) =>
Success(matched,
in.drop(start + matched.end - offset))
case None =>
Failure("string matching regex `"+r+"' expected but `"+in.first+"' found", in.drop(start - offset))
}
}
}
val t = regexMatch("""(\d\d)/(\d\d)/(\d\d\d\d)""".r) ^^ { case m => (m.group(1), m.group(2), m.group(3)) }
}
उदाहरण:
scala> X.parseAll(X.t, "23/03/1971")
res8: X.ParseResult[(String, String, String)] = [1.11] parsed: (23,03,1971)
स्रोत
2009-11-29 17:06:14
धन्यवाद डैनियल, एक आकर्षण की तरह काम करता है –
ग्रेट पोस्ट! अति उत्कृष्ट! – fotNelton
यह अजीब बात है, इस तरह की कार्यक्षमता मानक (पुस्तकालय) वर्ग कार्यान्वयन का हिस्सा क्यों नहीं है? यह बहुत उपयोगी दिखता है, लेकिन प्रत्येक उपयोगकर्ता को स्वयं इसे लागू करना चाहिए ... –