gpt4 book ai didi

ruby - 有没有办法在迭代 `String#split` 时访问最后的匹配信息?

转载 作者:数据小太阳 更新时间:2023-10-29 08:36:18 26 4
gpt4 key购买 nike

我想用正则表达式模式迭代一个字符串。我需要遍历匹配项以及它们之间的非匹配项,并在迭代时访问匹配信息。

如果我不需要访问不匹配项,那么我可以使用 String#scan 来完成:

"some string".scan(/(some pattern)|(another pattern)/) do
if $1 then ...
elsif $2 then ...
end
end

但我也需要遍历不匹配的部分,所以我可能需要使用 String#split。但是 String#split 不会占用一个 block ,如果我在它之后使用 each 就像:

"some string".split(/((some pattern)|(another pattern))/).each do
...
end

然后,我无法访问 block 中的匹配信息。我想做类似的事情:

"some string".split(/((some pattern)|(another pattern))/) do
if $2 then ...
elsif $3 then ...
else ... # access the non-matching part
end
end

有没有办法在使用 String#split 迭代时访问最后匹配信息?

我可以通过使用 scan 并在正则表达式末尾添加 |(.*?) 来暴力破解它:

"some string".scan(/(some pattern)|(another pattern)|(.*?)/) do
if $1 then ...
elsif $2 then ...
elsif $3 then ...
end
end

但是使用非贪婪匹配是非常低效的,我不能使用它。

最佳答案

如果您使用 match 一次只处理一个匹配的字符串而不是像 scan 那样一次性完成,您可以从 pre_match 注入(inject)数据与您的结果相结合:

def match_all(s, r)
match = s.match(r)

if match
pre_captures = [match.pre_match] + match.captures.map{nil}
captures = [nil] + match.captures
[pre_captures, captures] + match_all(match.post_match, r)
else
[[s]]
end
end

此代码将输入字符串转换为表示 [unmatched data, first match group, second match group, etc...] 的元组然后可以根据需要迭代数据:

match_all("the match information in the block", /(at)|(in)/).each do |a, b, c|
if a
puts "(pre: #{a})"
elsif b
puts "(1st: #{b})"
elsif c
puts "(2nd: #{c})"
end
end

哪些输出:

(pre: the m)
(1st: at)
(pre: ch )
(2nd: in)
(pre: form)
(1st: at)
(pre: ion )
(2nd: in)
(pre: the block)

同样的功能也可以像这样迭代实现:

def match_all_iter(s, r)
s_mut = s
all_captures = []

loop do
match = s_mut.match(r)

break unless match

pre_captures = [match.pre_match] + match.captures.map{nil}
captures = [nil] + match.captures
all_captures += [pre_captures, captures]

s_mut = match.post_match
end

all_captures += [[s_mut]]
end

关于ruby - 有没有办法在迭代 `String#split` 时访问最后的匹配信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36748407/

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