进行琐碎的搜索并通过正则表达式进行替换

时间:2019-06-24 21:03:37

标签: haskell

我正在使用regex-tdfa,它可以很容易地通过堆栈安装

在文档中可以看到,使用正则表达式谓词很简单:

λ> emailRegex = "[a-zA-Z0-9+._-]+@[a-zA-Z-]+\\.[a-z]+"
λ> "my email is email@email.com" =~ emailRegex :: Bool

如何搜索和替换此库? 例如,我想从字符串中过滤掉字符。

我无法使用fmap运算符对字符串进行=~的操作,因为它希望输入字符串而不是字符,这就是为什么我会被困住。

非常感谢。

1 个答案:

答案 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"