正则表达式的所有匹配的索引
我试图匹配一个正则表达式的所有事件,并得到结果的索引。 来自真实世界Haskell的例子说我可以做
string =~ regex :: [(Int, Int)]
然而,自从RWH发布以来,正则表达式库已经更新,这已经被破坏了。 (查看Haskell中所有正则表达式的匹配和“=〜”raise“No(RegexContext Regex [Char] [String])”)的实例。 什么是正确的方法来做到这一点?
更新:
我发现matchAll可能会给我想要的东西。 不过,我不知道如何使用它。
使用matchAll
的关键是在创建正则:: Regex
时使用类型注释:: Regex
:
import Text.Regex
import Text.Regex.Base
re = makeRegex "[^aeiou]" :: Regex
test = matchAll re "the quick brown fox"
这将返回一个数组列表。 要获得(偏移量,长度)对列表,只需访问每个数组的第一个元素:
import Data.Array ((!))
matches = map (!0) $ matchAll re "the quick brown fox"
-- [(0,1),(1,1),(3,1),(4,1),(7,1),(8,1),(9,1),(10,1),(11,1),(13,1),(14,1),(15,1),(16,1),(18,1)]
要使用=~
运算符,自RWH以来事情可能已发生变化。 您应该使用预定义的类型MatchOffset
和MatchLength
以及特殊类型的构造函数AllMatches
:
import Text.Regex.Posix
re = "[^aeiou]"
text = "the quick brown fox"
test1 = text =~ re :: Bool
-- True
test2 = text =~ re :: String
-- "t"
test3 = text =~ re :: (MatchOffset,MatchLength)
-- (0,1)
test4 = text =~ re :: AllMatches [] (MatchOffset, MatchLength)
-- (not showable)
test4' = getAllMatches $ (text =~ re :: AllMatches [] (MatchOffset, MatchLength))
-- [(0,1),(1,1),(3,1),(4,1),(7,1),(8,1),(9,1),(10,1),(11,1),(13,1),(14,1),(15,1),(16,1),(18,1)]
有关可用的上下文的更多详细信息,请参阅Text.Regex.Base.Context的文档。
更新:我相信类型构造函数AllMatches
是为了解决正则表达式引入的歧义而引入的 - 例如:
foo = "axx ayy" =~ "a(.)([^a])"
test1 = getAllMatches $ (foo :: AllMatches [] (MatchOffset, MatchLength))
-- [(0,3),(3,3)]
-- returns the locations of "axx" and "ayy" but no subexpression info
test2 = foo :: MatchArray
-- array (0,2) [(0,(0,3)),(1,(1,1)),(2,(2,1))]
-- returns only the match with "axx"
两者基本上都是偏移长度对的列表,但它们意味着不同的事情。
链接地址: http://www.djcxy.com/p/77311.html