查找重叠的正则表达式匹配项
Find overlapping Regexp matches
我想查找给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?
# Example
"a-b-c-d".???(/\w-\w/) # => ["a-b", "b-c", "c-d"] expected
# Solution without overlapped results
"a-b-c-d".scan(/\w-\w/) # => ["a-b", "c-d"], but "b-c" is missing
在正先行中使用捕获:
"a-b-c-d".scan(/(?=(\w-\w))/).flatten
# => ["a-b", "b-c", "c-d"]
我建议使用非正则表达式解决方案:
"a-b-c-d".delete('-').each_char.each_cons(2).map { |s| s.join('-') }
#=> ["a-b", "b-c", "c-d"]
或
"a-b-c-d".each_char.each_cons(3).select.with_index { |_,i| i.even? }.map(&:join)
#=> ["a-b", "b-c", "c-d"]
或
enum = "a-b-c-d".each_char
a = []
loop do
a << "%s%s%s" % [enum.next, enum.next, enum.peek]
end
a #=> ["a-b", "b-c", "c-d"]
我想查找给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?
# Example
"a-b-c-d".???(/\w-\w/) # => ["a-b", "b-c", "c-d"] expected
# Solution without overlapped results
"a-b-c-d".scan(/\w-\w/) # => ["a-b", "c-d"], but "b-c" is missing
在正先行中使用捕获:
"a-b-c-d".scan(/(?=(\w-\w))/).flatten
# => ["a-b", "b-c", "c-d"]
我建议使用非正则表达式解决方案:
"a-b-c-d".delete('-').each_char.each_cons(2).map { |s| s.join('-') }
#=> ["a-b", "b-c", "c-d"]
或
"a-b-c-d".each_char.each_cons(3).select.with_index { |_,i| i.even? }.map(&:join)
#=> ["a-b", "b-c", "c-d"]
或
enum = "a-b-c-d".each_char
a = []
loop do
a << "%s%s%s" % [enum.next, enum.next, enum.peek]
end
a #=> ["a-b", "b-c", "c-d"]