F# 如何使用FParsec解析具有不同起始字符和结束字符的标识符

F# 如何使用FParsec解析具有不同起始字符和结束字符的标识符,f#,fparsec,F#,Fparsec,我很难找到解析开头和结尾具有不同字符的标识符的最佳方法。例如,假设标识符的起始字符可能仅为大写和小写,而标识符的中间可能还包括数字和冒号。标识符的结尾不能是冒号,但可以是撇号 因此,以下是所有合法标识符: f, f0, f:', f000:sdfsd:asdf 但以下情况并非如此: 0, hello:, he'llo 我看不出如何最好地处理回溯:中间的冒号是好的,但是我们需要一些前瞻来确定我们是否在标识符的末尾。 编辑: 谢谢你的建议。使用正则表达式是一种实用的方法,但我觉得这有点令人失望,

我很难找到解析开头和结尾具有不同字符的标识符的最佳方法。例如,假设标识符的起始字符可能仅为大写和小写,而标识符的中间可能还包括数字和冒号。标识符的结尾不能是冒号,但可以是撇号

因此,以下是所有合法标识符:

f, f0, f:', f000:sdfsd:asdf
但以下情况并非如此:

0, hello:, he'llo

我看不出如何最好地处理回溯:中间的冒号是好的,但是我们需要一些前瞻来确定我们是否在标识符的末尾。 编辑:


谢谢你的建议。使用正则表达式是一种实用的方法,但我觉得这有点令人失望,因为似乎没有一种干净/明显的方法可以做到这一点

let ident = regex @"[A-Za-z][A-Za-z0-9\:]*[A-Za-z0-9\']"

我也认为您应该使用regex,但我提出了一种不同的模式:

let pattern = regex @"^([a-zA-Z]+[a-zA-Z0-9:]*[a-zA-Z']?)$"

它将保存第一组中所有想要的比赛。您可以使用联机验证您的匹配/分组

到目前为止你试过什么?对于其他人来说,解决特定问题比要求他们为您编写代码要容易得多。这听起来像是正则表达式的工作!这似乎是最简单的方法。不过,您的正则表达式并不完全正确,它拒绝使用任何单个字符标识符。您需要将除初始字符类之外的所有字符都设置为可选。我还想知道为什么要转义
字符。这很重要吗?这种模式似乎太自由了,因为它允许任何最终角色。我也不确定后面的
]
是干什么用的。公平地说,我在这里没有详细说明。目的是
[a-zA-Z0-9']