2011-07-18 79 views
6

我正在尋找一個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正則表達式庫?

回答

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

+0

我不知道,有一個不同於'=〜'的界面,以便... – fuz

+0

@FUZxxl好的正則表達式的複數形式。我真的笑了。正則表達式,regicis,regici,regicem,o正則表達式,regice ...這是常見的用法嗎? – Hyperboreus

+0

@Hyperboreus我從索引(索引)中得出它,儘管它似乎不是正則表達式的常見覆數。 – fuz