我目前正在编写一个 csv 解析器。 csv 格式的定义由下式给出RFC4180 https://www.rfc-editor.org/rfc/rfc4180这是由 ABNF 定义的。所以csv的定义绝对是上下文无关语法。不过我想知道csv是否是正则语法?这样我就可以用有限状态机来解析它。此外,如果它确实是一个正则语法并且可以被有限状态机解析,那么是否意味着它也可以被正则表达式解析?
因此,基于理论的答案是否定的,CSV 文件格式不是常规语言(基于 RFC)。
它不是的主要原因是基于规范中的这一行:
整个文件中的每一行应包含相同数量的字段。
要正式证明该文件格式不是常规语言,您可以使用常规语言的泵引理 https://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages.
考虑由 2 行和 p 列组成的字符串(其中 p 是泵送引理的泵送长度),其中每个单元格都是空的(因此,如果 p = 3,则它将是“,\n,\n”。按顺序要满足 |xy| 1 的条件,则文件第一行中的“y”必须是 1 个或多个逗号。如果您随后“泵送”y,那么您将获得更多单元格位于第一行,然后是第二行。因此,它不是常规语言。
However通常情况下,理论答案可能不是您真正需要的。其一,许多编程语言中的许多正则表达式语法(和有限状态机语法)实际上支持的不仅仅是真正的正则语言。
另外,仅仅因为您无法使用真正的正则表达式验证字符串是否真正符合 CSV 规范,并不意味着您仍然无法使用正则表达式解析它。您可以只接受格式稍有缺陷的 CSV 文件(例如行长度不均匀的文件)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)