我正在编写一个解析器来使用attoparsec解析大量的英文文本。到目前为止,一切都很好,除了解析这个char "――"
。我知道这只是两个破折号"--"
。奇怪的是,解析器在这段代码中捕获它:
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?我该如何解决?
答案 0 :(得分:4)
Char
是一个字符,句号。 ――
是两个字符,因此它是两个Char
。您可以根据需要将Char
个String
放入Char
,但是当然不能将两个Char
放入一个satisfy
。
由于inClass
一次考虑单个字符,如果您需要将两个字符的序列解析为一个单元,则可能不是您想要的。 inClass
函数只生成一个字符谓词(部分应用于一个参数的Char -> Bool
生成类型为inClass "――"
的函数),因此inClass ['―', '―']
与inClass ['―']
相同},这与string
相同,因为重复是无关紧要的。这对你没有多大帮助。
考虑使用inClass
代替wordSeparator :: Parser ()
wordSeparator = many1 (space <|> string "――" <|> satisfy (inClass "?!,:")) >> pure ()
或与SELECT
[GOODS_TYPE] = COALESCE([_TYPE_NAME], 'GRAND_TOTAL'),
b.GOODS_CODE,b.GOODSNAME,a.CURRENCY,a.CUSTOMER_CD, a.INVOICE_DATE,[QUANTITY] = SUM([QTY])
From [DVHead] a
inner join [DVRecords] b
on a.DELIVERYNO=b.DELIVERYNO
WHERE a.INVOICE_DATE='2018-05-04'
GROUP BY GROUPING SETS(([_TYPE_NAME],[GOODS_CODE],[GOODSNAME],
[CURRENCY],[CUSTOMER_CD],[INVOICE_DATE]),([_TYPE_NAME]),());
结合使用,因为它旨在处理字符的序列。例如,这样的事情可能更适合您的需求:
cellForRowAtIndexPath