如何判断我的数组是否有两个与正则表达式匹配的连续元素?

时间:2017-06-30 21:36:31

标签: arrays ruby

我使用的是Rails 5和Ruby 2.4。如果我有一个字符串数组,我如何判断是否有两个连续的字符串与正则表达式匹配?

例如,我有:

["1234", "aa", "cc33", "44"]

我想看看是否有两个以字母开头的连续元素(在上面的例子中,条件是true"aa""cc33")。但在下面的例子中,它将是false

["bb", "55", "mm", "77"]

my_arr.select { |str| str =~ /^\p{L}/ }

告诉我有多少字符串以字母开头,但它并没有告诉我是否有两个以字母开头的连续元素。

我怎么知道这个?

2 个答案:

答案 0 :(得分:3)

使用相同的正则表达式,您可以这样做:

my_arr.each_cons(2).any? { |pair| pair.all? { |elem| elem =~ /^\p{L}/ } }

检查this snippet

答案 1 :(得分:0)

我知道您希望确定数组的两个连续元素是否与给定的正则表达式匹配。为了有效地做到这一点,我们希望尽可能少地检查匹配的元素(字符串)。特别是,我们不希望必须检查数组的所有元素或检查单个元素两次。这是一种方法。

arr = ["1234", "aa", "cc33", "44"]
r = /\A[[:alpha:]]{2}/

a = [false, false]
arr.any? do |s| 
   a[0] = s.match?(r)
   a.rotate! == [true, true]
end
   #=> true

String#match?在Ruby v2.4中首次亮相。对于早期版本,可以编写!!(s =~ r)。内部感叹号将真实值转换为false,将虚假值转换为true;外部感叹号会从true转换为false,反之亦然。