加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

访问Scala Parser正则表达式匹配数据

发布时间:2020-12-16 09:01:57 所属栏目:安全 来源:网络整理
导读:我想知道是否可以从下面的语法中获得匹配正则表达式生成的MatchData. object DateParser extends JavaTokenParsers { .... val dateLiteral = """(d{4}[-/])?(dd[-/])?(dd)""".r ^^ { ... get MatchData }} 一个选项当然是在块内再次执行匹配,但是由于R
我想知道是否可以从下面的语法中获得匹配正则表达式生成的MatchData.

object DateParser extends JavaTokenParsers {

    ....

    val dateLiteral = """(d{4}[-/])?(dd[-/])?(dd)""".r ^^ {
        ... get MatchData
    }
}

一个选项当然是在块内再次执行匹配,但是由于RegexParser已经执行了匹配,我希望它将MatchData传递给块,或者存储它?

解决方法

这是将您的正则表达式转换为解析器的隐式定义:

/** 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,source.length))) match {
        case Some(matched) =>
          Success(matched,in.drop(start - offset))
      }
    }
  }
  val t = regexMatch("""(dd)/(dd)/(dddd)""".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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读