正则表达式的所有匹配的索引

我试图匹配一个正则表达式的所有事件,并得到结果的索引。 来自真实世界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以来事情可能已发生变化。 您应该使用预定义的类型MatchOffsetMatchLength以及特殊类型的构造函数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

上一篇: Indices of all matches of a regex

下一篇: Inject debug information into Entity Framework queries