如何在数组中找到与正则表达式匹配的连续字符串?

时间:2017-07-16 15:46:28

标签: arrays ruby regex string

我使用的是Ruby 2.4。我想在我的字符串数组中找到与正则表达式匹配的连续标记。所以,如果我的正则表达式是

/\p{L}/

我的数组是

 ["2917", "m", "neatty", "fff", "46", "u", "28", "56"]

我希望结果是

["m", "neatty", "fff"]

然而,我尝试这样做的尝试失败了(注意"整洁"令牌重复)......

2.4.0 :020 > arr = ["2917", "m", "neatty", "fff", "46", "u", "28", "56"]
 => ["2917", "m", "neatty", "fff", "46", "u", "28", "56"]
2.4.0 :021 > arr.each_cons(2).select{|pair| pair.all?{|elem| elem =~ /\p{L}/ }}.flatten
 => ["m", "neatty", "neatty", "fff"]

如何在数组中找到与不重复的模式相匹配的连续标记?

3 个答案:

答案 0 :(得分:3)

如果r是您的正则表达式,请使用chunk_while

arr.chunk_while { |a,b| a[r] && b[r] }.select { |arr| arr.size > 1 }     
 #=> [["m", "neatty", "fff"]]

答案 1 :(得分:2)

您还可以使用slice_when查找绑定条件的子数组的边框:

> arr.slice_when {|x,y| !x[reg] || !y[reg] }.select {|e| e.length>1}
=> [["m", "neatty", "fff"]]

答案 2 :(得分:0)

arr = ["2917", "m", "neatty", "fff", "46", "u", "28", "56", "hi", "%ya!"]
r = /\p{L}/

arr.each_with_object([[]]) { |s,a| s.match?(r) ? (a.last << s) : a << [] }.
    reject { |a| a.size < 2 }
  #=> [["m", "neatty", "fff"], ["hi", "%ya!"]]