查找正则表达式的所有捕获组

时间:2011-07-18 06:06:36

标签: regex haskell

我正在寻找一个Haskell函数,它返回给定正则表达式的所有匹配的捕获组。

我一直在看Text.Regex,但在那里找不到任何东西。

现在我正在使用这种似乎有用的解决方法:

import Text.Regex

findNext :: String -> Maybe (String, String, String, [String] ) -> [ [String] ]
findNext pattern Nothing = []
findNext pattern (Just (_, _, rest, matches) ) = 
    case matches of
        [] -> (findNext pattern res)
        _ -> [matches] ++ (findNext pattern res)
    where res = matchRegexAll (mkRegex pattern) rest

findAll :: String -> String -> [ [String] ]
findAll pattern str = findNext pattern (Just ("", "", str, [] ) )

结果:

findAll "x(.)x(.)" "aaaxAxaaaxBxaaaxCx"
[["A","a"],["B","a"]]

问题:

  • 我是否遗漏了Text.Regex中的内容?
  • 是否有实现findAll函数的Haskell正则表达式库?

1 个答案:

答案 0 :(得分:8)

您可以使用Text.Regex.Posix中的=~运算符:

Prelude> :mod + Text.Regex.Posix
Prelude Text.Regex.Posix> "aaaxAxaaaxBxaaaxCx" =~ "x(.)x(.)" :: [[String]]
[["xAxa","A","a"],["xBxa","B","a"]]

请注意显式[[String]]类型。尝试将其替换为BoolIntString,看看会发生什么。您可以在此上下文中使用的所有类型都列出here。另请参阅this tutorial