在select块中使用regex的Ruby

在select块中使用regex的Ruby,ruby,regex,select,Ruby,Regex,Select,我在筛选正则表达式匹配项时遇到了很多麻烦。我可以使用scan,但因为它只对字符串进行操作,而且我不想在所讨论的数组上使用连接,所以它要繁琐得多。我希望能够做到以下几点: array = ["a1d", "6dh","th3"].select{|x| x =~ /\d/} # => ["1", "6", "3"} 然而,这似乎从未奏效。有解决办法吗?还是我只需要使用扫描?试试: > array = ["a1d", "6dh","th3"].map {|x| x[/\d+/]} #=&

我在筛选正则表达式匹配项时遇到了很多麻烦。我可以使用scan,但因为它只对字符串进行操作,而且我不想在所讨论的数组上使用连接,所以它要繁琐得多。我希望能够做到以下几点:

array = ["a1d", "6dh","th3"].select{|x| x =~ /\d/}
# => ["1", "6", "3"}
然而,这似乎从未奏效。有解决办法吗?还是我只需要使用扫描?

试试:

> array = ["a1d", "6dh","th3"].map {|x| x[/\d+/]}
#=> ["1", "6", "3"] 
注意:

> array = ["a1d", "6dh","th3"].map {|x| x[/\d+/]}
#=> ["1", "6", "3"] 
返回一个新数组,该数组包含给定 块返回一个真值

在您的情况下,每个元素都包含数字,并且返回true,因此您可以通过
选择
获取原始元素。而
map
将对每个元素执行操作,并返回对每个元素执行操作的新数组。

您可以与块一起使用:

array = ["a1d", "6dh", "th3"]

array.grep(/(\d)/) { $1 }
#=> ["1", "6", "3"]
它将每个匹配元素传递给块,并返回包含块结果的数组

$1
是包含第一个捕获组的

与映射不同,只返回匹配的元素:

array = ["a1d", "foo", "6dh", "bar", "th3"]

array.grep(/(\d)/) { $1 }
#=> ["1", "6", "3"]

array.map { |s| s[/\d/] }
#=> ["1", nil, "6", nil, "3"]

根据您的需求,您可能希望构造一个散列

arr = ["a1d", "6dh", "th3", "abc", "3for", "rg6", "def"]

arr.each_with_object(Hash.new { |h,k| h[k] = [] }) { |str,h| h[str[/\d+/]] << str }
  #=> {"1"=>["a1d"], "6"=>["6dh", "rg6"], "3"=>["th3", "3for"], nil=>["abc", "def"]} 
第三行中的表达式也可以写成

arr.each_with_object({}) { |str,h| (h[str[/\d+/]] ||= []) << str }

我能说什么?

@Gagan\u Gami您的解决方案有效。你能解释一下我的误解吗?我认为会发生的是,使用select,它将返回匹配数组,并将数组分配给它。为什么没有发生这种情况?根据OP的要求,可能是
/-?\d+/
@WillAshley:更新了我的答案,但没有做什么解释。@CarySwoveland:可能是。我不擅长正则表达式,所以不清楚其中的差别,但它工作正常。能否
array=[“abc”,“66dh”,“th-3”]
?如果
array
可能包含
“abc”
,那么它应该映射到返回的数组中的什么(例如
nil
)?我开始想知道为什么我应该费心问一些旨在澄清问题的问题。或者简单地说,{str str | str[/\d+/]}
arr.group_by { |str| str[/\d+/] }
  #=> {"1"=>["a1d"], "6"=>["6dh", "rg6"], "3"=>["th3", "3for"], nil=>["abc", "def"]}