解析 Haskell 中的字符 (――) 时出错
Error parsing a char (――) in Haskell
我正在编写一个解析器来使用 attoparsec 解析大量英文文本。到目前为止一切都很好,除了解析这个字符 "――"
。我知道这只是 2 个破折号 "--"
。奇怪的是,解析器在这段代码中捕获了它:
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass "――?!,:")) >> pure ()
但在这种情况下不是:
specialChars = ['――', '?', '!', ',', ':']
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass specialChars)) >> pure ()
我使用列表 specialChars
的原因是因为我有很多字符需要考虑并且我将它应用到多个案例中。对于输入,请考虑:"I am ――Walt Whitman._"
并且输出应该是 {"I", "am", "Walt", "Whiteman."}
我相信这主要是因为 "――"
不是 Char?我该如何解决?
一个Char
是一个字符,句号。 ――
是两个字符,所以是两个Char
。您可以将任意多的 Char
装入一个 String
,但您肯定不能将两个 Char
装入一个 Char
.
由于 satisfy
一次考虑单个字符,如果您需要将两个字符的序列作为一个单元进行解析,这可能不是您想要的。 inClass
函数只产生一个字符谓词(inClass
部分应用于一个参数产生类型 Char -> Bool
的函数),因此 inClass "――"
与 [=23= 相同],这与 inClass ['―']
相同,因为重复项无关紧要。那对你帮助不大。
考虑使用 string
代替 inClass
或与 inClass
结合使用,因为它旨在处理 字符序列 。例如,这样的内容可能更适合您的需求:
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> string "――" <|> satisfy (inClass "?!,:")) >> pure ()
我正在编写一个解析器来使用 attoparsec 解析大量英文文本。到目前为止一切都很好,除了解析这个字符 "――"
。我知道这只是 2 个破折号 "--"
。奇怪的是,解析器在这段代码中捕获了它:
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass "――?!,:")) >> pure ()
但在这种情况下不是:
specialChars = ['――', '?', '!', ',', ':']
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass specialChars)) >> pure ()
我使用列表 specialChars
的原因是因为我有很多字符需要考虑并且我将它应用到多个案例中。对于输入,请考虑:"I am ――Walt Whitman._"
并且输出应该是 {"I", "am", "Walt", "Whiteman."}
我相信这主要是因为 "――"
不是 Char?我该如何解决?
一个Char
是一个字符,句号。 ――
是两个字符,所以是两个Char
。您可以将任意多的 Char
装入一个 String
,但您肯定不能将两个 Char
装入一个 Char
.
由于 satisfy
一次考虑单个字符,如果您需要将两个字符的序列作为一个单元进行解析,这可能不是您想要的。 inClass
函数只产生一个字符谓词(inClass
部分应用于一个参数产生类型 Char -> Bool
的函数),因此 inClass "――"
与 [=23= 相同],这与 inClass ['―']
相同,因为重复项无关紧要。那对你帮助不大。
考虑使用 string
代替 inClass
或与 inClass
结合使用,因为它旨在处理 字符序列 。例如,这样的内容可能更适合您的需求:
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> string "――" <|> satisfy (inClass "?!,:")) >> pure ()