Arrays 如何确定数组中是否有两个与正则表达式匹配的连续元素?
我正在使用Rails 5和Ruby 2.4。如果我有一个字符串数组,如何判断是否有两个连续的字符串与正则表达式匹配 例如,我有:Arrays 如何确定数组中是否有两个与正则表达式匹配的连续元素?,arrays,ruby,Arrays,Ruby,我正在使用Rails 5和Ruby 2.4。如果我有一个字符串数组,如何判断是否有两个连续的字符串与正则表达式匹配 例如,我有: ["1234", "aa", "cc33", "44"] 我想看看是否有两个以字母开头的连续元素(在上面的例子中,条件是true,“aa”和“cc33”)。但在以下情况下,它将是false: ["bb", "55", "mm", "77"] 这个 告诉我有多少字符串以字母开头,但它没有告诉我是否有两个以字母开头的连续元素 我该如何计算呢?使用相同的正则表达式,您可
["1234", "aa", "cc33", "44"]
我想看看是否有两个以字母开头的连续元素(在上面的例子中,条件是true
,“aa”
和“cc33”
)。但在以下情况下,它将是false
:
["bb", "55", "mm", "77"]
这个
告诉我有多少字符串以字母开头,但它没有告诉我是否有两个以字母开头的连续元素
我该如何计算呢?使用相同的正则表达式,您可以执行以下操作:
my_arr.each_cons(2).any? { |pair| pair.all? { |elem| elem =~ /^\p{L}/ } }
检查。我知道您希望确定数组的两个连续元素是否与给定的正则表达式匹配。为了有效地执行此操作,我们希望检查尽可能少的元素(字符串)以进行匹配。特别是,我们不需要检查数组的所有元素,也不需要检查单个元素两次。这里有一种方法可以做到这一点
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
在Ruby v2.4中首次亮相。对于早期版本,可以编写
!!(s=~r)
。内部感叹号将真实值转换为false
,将虚假值转换为true
;外部感叹号从true
翻转到false
,反之亦然 类似于arr.each_cons(2)。有吗?{| a,b | a[/\a[a-z]/i]&&b[/\a[a-z]/i]}
如果您想要比每一项都快的东西,请查看这个,它有一些替代方案。
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