我正在使用regex-tdfa,它可以很容易地通过堆栈安装
在文档中可以看到,使用正则表达式谓词很简单:
λ> emailRegex = "[a-zA-Z0-9+._-]+@[a-zA-Z-]+\\.[a-z]+"
λ> "my email is email@email.com" =~ emailRegex :: Bool
如何搜索和替换此库? 例如,我想从字符串中过滤掉字符。
我无法使用fmap
运算符对字符串进行=~
的操作,因为它希望输入字符串而不是字符,这就是为什么我会被困住。
非常感谢。
答案 0 :(得分:2)
您可以使用(=~)
格式来返回“前”,“匹配”和“后”部分。要仅替换第一次出现的内容,请使用:
replace1 :: String -> String -> String -> String
replace1 pat repl str
= let (a,b,c) = str =~ pat :: (String, String, String)
in a ++ repl ++ c
要替换所有不重叠的情况,请使用递归解决方案。
replace :: String -> String -> String -> String
replace pat repl str
= case str =~ pat :: (String, String, String) of
(rest, "", "") -> rest
(a, b, c) -> a ++ repl ++ replace pat repl c
如果您想要比固定文本替换更新颖的方法,则可以通过显而易见的方式将repl
的类型从String
更改为String -> String
,或使用“获取第一个匹配项并子匹配”表单,如果您还希望repl :: String -> [String] -> String
对子匹配采取行动。
当然,如果您真的想“从字符串中过滤掉字符”,那么更好的解决方案是:
filter (not . isDigit) "N0 0ne 7ike5 num83r5"