2011-07-18 11 views
6

Poszukuję funkcji Haskell, która zwraca grupy przechwytujące wszystkich dopasowań danego wyrażenia regularnego.Znajdź wszystkie przechwytujące grupy wyrażenia regularnego

Patrzyłem na Text.Regex, ale nie mogłem tam niczego znaleźć.

Teraz używam tego obejścia, który wydaje się działać:

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, [])) 

Wynik:

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

Pytanie:

  • Coś mnie ominęło w Text.Regex?
  • Czy istnieje biblioteka wyrażeń regularnych Haskell, która implementuje funkcję findAll?

Odpowiedz

8

Można użyć operatora =~ z Text.Regex.Posix:

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

Uwaga wyraźne [[String]] typu. Spróbuj zastąpić go Bool, Int, String i zobacz, co się stanie. Wszystkie typy, których można używać w tym kontekście, są wymienione na here. Zobacz także this tutorial.

+0

Nie wiedziałem, że istnieje interfejs inny niż "= ~" do reguł przed ... – fuz

+0

@FUZxxl Ładne pseudo liczby mnogiej wyrażenia regularnego. Naprawdę się śmiałem. regex, regicis, regici, regicem, o regex, regice ... Czy to powszechne użycie? – Hyperboreus

+0

@Hyperboreus Wyprowadziłem go z indeksu (indeksy), choć wydaje się, że nie jest to zwykła liczba mnoga, która jest wyrażeń regularnych. – fuz

Powiązane problemy