gpt4 book ai didi

haskell - 如何使用 parsec 忽略任意标记?

转载 作者:行者123 更新时间:2023-12-04 02:59:12 24 4
gpt4 key购买 nike

我想用 Parsec 替换 sedawk。例如,从 未知结构但包含数字 42 和可能包含其他内容 的字符串中提取数字。

我遇到了“意外的输入结束”。我正在寻找等效的非贪婪 .*([0-9]+).*.

module Main where

import Text.Parsec

parser :: Parsec String () Int
parser = do
_ <- many anyToken
x <- read <$> many1 digit
_ <- many anyToken
return x

main :: IO ()
main = interact (show . parse parser "STDIN")

最佳答案

这可以通过我的图书馆轻松完成 regex-applicative .它为您提供了您似乎想要的组合器接口(interface)和正则表达式的功能。

这是一个最接近您示例的工作版本:

{-# LANGUAGE ApplicativeDo #-}
import Text.Regex.Applicative
import Text.Regex.Applicative.Common (decimal)

parser :: RE Char Int
parser = do
_ <- few anySym
x <- decimal
_ <- many anySym
return x

main :: IO ()
main = interact (show . match parser)

这是一个更短的版本,使用 findFirstInfix:

import Text.Regex.Applicative
import Text.Regex.Applicative.Common (decimal)

main :: IO ()
main = interact (snd3 . findFirstInfix decimal)
where snd3 (_, r, _) = r

如果您想执行实际的标记化(例如跳过 foo93bar 中的 93),请查看 lexer-applicative ,一个基于正则表达式应用的分词器。

关于haskell - 如何使用 parsec 忽略任意标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50881907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com