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

7
我正在寻找一个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中错过了什么吗?
  • 是否有一个Haskell正则表达式库实现了findAll函数?
1个回答

8
您可以使用来自Text.Regex.Posix=~运算符:
Prelude> :mod + Text.Regex.Posix
Prelude Text.Regex.Posix> "aaaxAxaaaxBxaaaxCx" =~ "x(.)x(.)" :: [[String]]
[["xAxa","A","a"],["xBxa","B","a"]]

请注意显式的[[String]]类型。尝试将其替换为Bool、Int、String,看看会发生什么。您可以在此处查看可以在此上下文中使用的所有类型。还请参阅本教程

我之前不知道除了=~之外还有另一种用于正则表达式的接口。 - fuz
@FUZxxl,正则表达式的伪复数形式真是太有趣了,我笑翻了。regex、regicis、regici、regicem、o regex、regice……这种用法常见吗? - Hyperboreus
@Hyperboreus 我从 index (indices) 推导出来的,尽管它似乎不是常见的复数形式,即 regexes。 - fuz
1
当然,"regex" 的正确复数形式实际上是 "regexen",因为你可以通过将 "ox" 变成复数来明显地推导出它。 - Daniel Wagner
@Daniel 有趣的观点。^^ 当然,“index”是拉丁词,其属格为“indicis”,因此复数形式为“indices”。 “Regex”是“regular expression”的缩写,因此它的复数形式是“regular expressions”。尽管,“regices”听起来更加复杂。 - Hyperboreus
@Hyperboreus 可以说,由于它是“正则表达式”的首字母缩写,所以复数形式可以是“regexs”(或者“regexes”,模仿单词“ex”)。 - Mew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接