Haskell正则表达式和读取字符串作为整数

时间:2012-07-23 13:57:54

标签: regex haskell

我想说我想考虑输入表格

[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.然而,我被困的地方是试图将这个索引视为一个整数。例如,我可以参考元素:

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

但是我无法将其转换为int,我已经尝试了

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

然而,尽管

,但这不起作用
:t (p !! 0) !! 2
> (p !! 0) !! 2 :: String

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

再次感谢。

1 个答案:

答案 0 :(得分:4)

我不完全确定你的方法是我推荐的方法,但我很难绕过目标,所以我只想回答这个问题。

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

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

在这种情况下它是明确的,所以你得到一个解析,然后你可以从中取出int,虽然考虑你未来的自尊表明是防御性而不是假设总会有一个有效的解析(安全模块)对于那种事情是好的。)

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