繁体   English   中英

如何从 Haskell 中的字符串中提取所有数字?

[英]How to extract all numbers from a string in Haskell?

所以基本上,假设我有一个 String = "W2932,B23829,/,,,W29"

如何提取所有数字以便我有一个列表 = [2932, 23829, 29]

遗憾的是还没有在 SO 或谷歌上找到任何解决方案。 我考虑过将字符串的每个字符检查为一个数字,然后将它们相加,但只能单独生成所有数字的列表。

https://hackage.haskell.org/package/replace-megaparsec

import Replace.Megaparsec (splitCap)
import Text.Megaparsec.Char.Lexer (decimal)
import Data.Either (rights)

rights $ splitCap decimal "W2932,B23829,/,,,W29"
[2932,23829,29]

我在解决Advent of Code 2022 day 5时遇到了这个问题。 字符串的格式为"move 1 from 2 to 12" ,我需要获取[1, 2, 12] 这与 OP 的问题相同,我想在没有包的情况下解决它。 OP 的尝试/想法基本上是this ,如前所述,它不会将多位数运行收集到多位数中。

我采取的解决方案是丢弃任何领先的非数字块,吞下下一个数字块并在这两个操作之后在尾部递归重复,将找到的数字粘到递归生成的子列表的前面。

import Data.Char (isDigit)

nonDigit :: Char -> Bool
nonDigit = not . isDigit

extractNumbers :: String -> [Int]
extractNumbers [] = []
extractNumbers xs = do
    let afterDroppingNonDigits = dropWhile nonDigit xs
    let num = takeWhile isDigit afterDroppingNonDigits
    let afterDroppingNumber = dropWhile isDigit afterDroppingNonDigits
    if num == [] then []
    else [read num :: Int] ++ extractNumbers afterDroppingNumber

main :: IO ()
main = do
    print $ extractNumbers "W2932,B23829,/,,,W29" -- [2932,23829,29]
    print $ extractNumbers "22,33,44" -- [22,33,44]
    print $ extractNumbers "22,33,44 " -- [22,33,44]
    print $ extractNumbers " " -- []
    print $ extractNumbers "" -- []

我来自命令式背景和娱乐性的 Haskelling,所以我确信有一种更优雅的方法可以做到这一点。 请随时留下改进建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM