首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析转义CSV行的Parboiled2语法

解析转义CSV行的Parboiled2语法
EN

Stack Overflow用户
提问于 2015-07-16 15:26:26
回答 1查看 307关注 0票数 3

我正在尝试解析一行,其中包含由分隔符分隔的字符串,并将其转换为这些字符串的序列。它应该能够在字符串中包含任何字符,如果一个字段包含一个分隔符,那么它周围需要双引号。为了在这样的字段中有双引号,双引号被转义。

我用这个作为起点:https://github.com/sirthias/parboiled2/blob/695ee6603359cfcb97734edf6dd1d27383c48727/examples/src/main/scala/org/parboiled2/examples/CsvParser.scala

我的语法是这样的:

代码语言:javascript
复制
class CsvParser(val input: ParserInput, val delimiter: String = ",") extends Parser {
  def line: Rule1[Seq[String]] = rule {record ~ EOI}
  def record = rule(oneOrMore(field).separatedBy(delimiter))

  def QUOTE = "\""
  def ESCAPED_QUOTE = "\\\""
  def DELIMITER_QUOTE = delimiter+"\""
  def WS = " \t".replace(delimiter, "")

  def field = rule{whiteSpace ~ ((QUOTE ~ escapedField ~ QUOTE) | unquotedField) ~ whiteSpace}
  def escapedField = rule { capture(zeroOrMore(noneOf(QUOTE) | ESCAPED_QUOTE)) ~> (_.replace(ESCAPED_QUOTE, QUOTE))  } 
  def unquotedField = rule { capture(zeroOrMore(noneOf(DELIMITER_QUOTE))) }
  def whiteSpace = rule(zeroOrMore(anyOf(WS)))
}

当我用"quote\"key",1,2调用它时,我得到了Invalid input 'k', expected whiteSpace, ',' or 'EOI' (line 1, column 9)

我做错了什么?我将如何调试这个?(还有一个额外的问题:如何扩展语法以允许分隔符成为像##这样的多个字符?)

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-17 15:55:44

Parboiled2似乎没有回溯地执行规则。

在这种特殊情况下

代码语言:javascript
复制
def escapedField = rule { capture(zeroOrMore(noneOf(QUOTE) | ESCAPED_QUOTE)) ~> (_.replace(ESCAPED_QUOTE, QUOTE))  } 

noneOf(QUOTE)捕获\ from \“然后返回,而不是回溯并试图捕获完整的\”。

该错误通过使用

代码语言:javascript
复制
def escapedField = rule { capture(ESCAPED_QUOTE | zeroOrMore(noneOf(QUOTE))) ~> (_.replace(ESCAPED_QUOTE, QUOTE))  } 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31458447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档