我正在尝试使用以下对象的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
答案 0 :(得分:1)
我认为你最后错过了一个.r
来实际拥有正则表达式而不是字符串文字。
def time = """([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)"""
应该是
def time = """([\d]{2}:[\d]{2}:[\d]{2}\.[\d]+)""".r
第一个期望文本与正则表达式字符串文字(显然不存在)完全相同,第二个期望文本实际匹配正则表达式。两者都创建了Parser[String]
,因此缺少某些东西并不是很明显。
- 从java.lang.String到Parser [String]的隐式转换,因此字符串文字可以用作解析器组合器。
- 从scala.util.matching.Regex隐式转换为>解析器[String],以便正则表达式可以用作解析器组合器。