在 JavaTokensParser 子类中使用正则表达式解析器

Using regex parser within a JavaTokensParser subclass

我正在使用以下对象尝试 Scala 解析器组合器:

object LogParser extends JavaTokenParsers with PackratParsers {

部分解析器正在运行。但是下面的一个被绊倒了:

 def time  = """([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)"""

以下是输入无效:

09:58:24.608891

到达那条线后,我们得到:

[2.22] failure: `([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)' expected but `:' found

09:58:24.608891

注意:我确实在同一输入模式的 scala repl 中验证了该正则表达式的正确行为。

val r = """([\d]{2}):([\d]{2}):([\d]{2}\.[\d]+)""".r
val s = """09:58:24.608891"""

val r(t,t2,t3) = s
t: String = 09
t2: String = 58
t3: String = 24.608891

所以.. AFA 解析器组合器:“:”标记本身是否存在问题 - 即需要创建我自己的自定义 Lexer 并将“:”添加到 lexical.delimiters?

更新 提供了添加“.r”的答案。我已经尝试过 - 但无论如何要明确:以下具有相同的行为(不起作用):

def time = """([\d]{2}:[\d]{2}:[\d]{2}.[\d]+)""" .r

我认为你只是在此处的末尾缺少了一个 .r 来实际使用正则表达式而不是字符串文字。

 def time  = """([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)"""

应该是

 def time  = """([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)""".r

第一个期望文本与正则表达式字符串文字完全一样(显然不存在),第二个期望文本与正则表达式实际匹配。两者都创建了一个 Parser[String],因此不会立即发现缺少某些内容。

  • There's an implicit conversion from java.lang.String to Parser[String], so that string literals can be used as parser combinators.
  • There's an implicit conversion from scala.util.matching.Regex to > Parser[String], so that regex expressions can be used as parser combinators.

http://www.scala-lang.org/files/archive/api/2.11.2/scala-parser-combinators/#scala.util.parsing.combinator.RegexParsers