f# - 使用 FParsec 我将如何解析:以换行符 <|> 结尾的行以 eof 结尾的行
问题描述
我正在解析一个文件,并想丢弃我不感兴趣的文件的某些行。我已经能够让它适用于所有情况,除了最后一行是一次性的并且没有结束时新队。
我尝试构建一个endOfInput
规则并skipLine
通过<|>
. 这一切都包裹在一个many
. skipLine
当我不尝试某种回溯时, 调整一切我似乎要么得到“许多成功而不消耗输入......”错误或规则失败。
let skipLine = many (noneOf "\n") .>> newline |>> fun x -> [string x]
let endOfInput = many (noneOf "\n") .>> eof |>> fun x -> [string x]
test (many (skipLine <|> endOfInput)) "And here is the next.\nThen the last."
** 在最后一行的 skipLine 解析器上出现此错误
我试过了
let skipLine = many (noneOf "\n") .>>? newline |>> fun x -> [string x]
... 和 ...
let skipLine = many (noneOf "\n") .>> newline |>> fun x -> [string x]
test (many (attempt skipLine <|> endOfInput)) "And here is the next.\nThen the last."
** 这些会产生很多错误
注意:输出函数只是让它们与我的其他规则一起使用的占位符。我还没有弄清楚如何格式化输出。这是我第一次使用 FParsec,而且我是 F# 的新手。
解决方案
FParsec 实际上有一个内置的解析器,它可以完全满足您的需求:skipRestOfLine
. 它在换行符或 eof 处终止,就像您要查找的内容一样。
如果您想尝试自己将其作为学习练习来实施,请告诉我,我会尽力帮助您解决问题。但是,如果您只想要一个跳过字符直到行尾的解析器,那么内置skipRestOfLine
正是您所需要的。
推荐阅读
- javascript - 如何将 .CSV 文件解析为数组,以便在代码中进一步操作?
- bash - Escape 双反斜线 Jenkins Pipeline
- azure - 如何在 Azure 数据工厂中获取或读取 .bak 文件?
- python - 使用python从频率数组中进行音调扫描
- vue.js - 何时延迟加载组件
- php - 如何在 PHP 中检测图像上的蒙版区域?
- typescript - 在嵌套数组中添加对象
- c# - Xamarin 表单未实现绑定
- computer-vision - Convlstm2d ValueError
- python - 如何使用 CDK 向 Lambda 函数添加权限?