在select块中使用regex的Ruby
我在筛选正则表达式匹配项时遇到了很多麻烦。我可以使用scan,但因为它只对字符串进行操作,而且我不想在所讨论的数组上使用连接,所以它要繁琐得多。我希望能够做到以下几点:在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+/]} #=&
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"]}