2011-07-18 25 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

関連する問題