gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:32:12 28 4
gpt4 key购买 nike

我正在尝试匹配所有出现的正则表达式并得到索引。来自 Real World Haskell 的例子说我可以做到

string =~ regex :: [(Int, Int)]

但是,自从 RWH 发布以来,正则表达式库已经更新,因此这被打破了。 (见 All matches of regex in Haskell"=~" raise "No instance for (RegexContext Regex [Char] [String])")。这样做的正确方法是什么?

更新:

我找到了 matchAll这可能会给我我想要的。不过,我不知道如何使用它。

最佳答案

使用matchAll的关键正在使用类型注释 :: Regex创建正则表达式时:

import Text.Regex
import Text.Regex.Base

re = makeRegex "[^aeiou]" :: Regex
test = matchAll re "the quick brown fox"

这将返回一个数组列表。要获取 (offset,length) 对的列表,只需访问每个数组的第一个元素:
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"

两者本质上都是偏移长度对的列表,但它们的含义不同。

关于regex - 正则表达式的所有匹配的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21594587/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com