【问题标题】:Haskell Regular Expressions and Reading String as IntegerHaskell 正则表达式和将字符串读取为整数
【发布时间】:2012-07-23 13:57:53
【问题描述】:

假设我想考虑表单的输入

[int_1, int_2, ..., int_n]
[int_1, int_2, ..., int_m]
...

从文本文件中读取输入。我的目标是获得此列表的最大大小。目前我有一个识别这种模式的正则表达式:

let input = "[1,2,3] [1,2,3,4,5]"
let p = input =~ "(\\[([0-9],)*[0-9]\\])" :: [[String]]

输出:

[["[1,2,3]","[1,2,3]","2,"],["[1,2,3,4,5]","[1,2,3,4,5]","4,"]]

所以我追求的是第三个索引 + 1 的最大值。但是,我被困的地方是试图将此索引视为一个 int。例如,我可以很好地引用元素:

(p !! 0) !! 2
> "2,"

但是我不能把它转换成int,我试过了

read( (p !! 0) !! 2)

但是,尽管

:t (p !! 0) !! 2
> (p !! 0) !! 2 :: String

似乎是一个字符串。任何关于为什么我不能将其作为 int 阅读的建议将不胜感激。

再次感谢。

【问题讨论】:

  • 如果您需要列表的长度,则无需转换为整数值。使用length $ (read "[1, 2, 3, 4 ,5]" :: [Int]) 有效。

标签: regex haskell


【解决方案1】:

我不完全确定你的方法是我推荐的方法,但我正在努力解决目标,所以我会回答这个问题。

问题是read "2," 不能只产生一个 Int,因为有一个剩余的逗号。您可以使用reads 来解决这个问题。 reads 产生一个可能的解析列表和剩余的字符串,所以:

 Prelude> (reads "2,") :: [(Int,String)]
 [(2,",")]

在这种情况下,它是明确的,因此您会得到一个解析,然后您可以从中提取 int,尽管考虑到您未来的自尊心建议您采取防御措施,而不是假设总会有一个有效的解析(安全模块对那种事情有好处)。

或者,您可以修改您的正则表达式以不在匹配组中包含逗号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多