examp = [["packed"], ["crud"], ["paced"], ["it"], ["emo"], ["wrote"], ["pcd"], ["ppcd"], ["pcd"]]
word = 'pcd'
foo = examp.select { |a| a[0][/[aeiou#{word}]/] }
p foo
预期输出:[[ “节奏”],[ “PCD”]]
实际输出:
[ “包装”],[ “污物”],[ “节奏”],[ “它”],[ “EMO”],[ “写道:”],[ “PCD”]
编辑:[ “PPCD”]和[ “PCD”](第二次)添加到阵列。 我忘了提,我也希望排除在pcdaeiou一个字母出现了多次出现不止一次字或词。 抱歉。
编辑2:具体问题是我要通过给定的字符串(字母)+其他一些字母来过滤的阵列。 我不想出去把包含有什么的话,但是,在本例中,pcdaeiou。 然而,AEIOU的允许重复,我只是不想P,C,或d的重复实例。
[]
在一个正则表达式表示字符类。 它匹配一个字符,在它的任何字符。 因此,它的结论,即包含A,E,I,O,U,P,C或D的任何单词。
目前尚不清楚你真正虽历经......你说什么AP,C,要求D,同时也让元音,但没有任何其他的辅音? 如果是的话,我会说这是最简单的使用两个正则表达式。 一看到,如果你需要的字母都存在,而另一个以确保它仅包含字母,你允许。
而对于所有神圣...使用=~
examp.select do |a|
a[0] =~ /#{word}/ && a[0] =~ /^[#{word}aeiou]+$/
end
我假定的问题是,“选择所有阵列[str]
从examp
的量,字符串的所有字符str
是a, e, i, o or u
或变量的值中的字母中的一个word
”。
examp = [["packed"], ["crud"], ["paced"], ["it"], ["emo"], ["wrote"], ["pcd"]]
word = 'pcd'
p examp.flatten.select {|a| a.chars.all? {|c|
"aeiou#{word}".include?(c)}}.map {|e| [e]} # => [["paced"], ["pcd"]]
编辑:如果我上面的问题,每个字符str
“消耗”的匹配字符"aeioupcd"
,然后我的解决方案可以进行如下修改:
examp = [["packed"], ["crud"], ["paced"], ["it"], ["emo"], ["wrote"], ["pcd"], ["ppcd"]]
str = "aeiou#{word}" # => "aeioupcd"
p examp.flatten.select {|a| s = str.dup; a.chars.all? {|c|
s.delete!(c)}}.map {|e| [e]} # => [["paced"], ["pcd"]]
对于a == "ppcd"
"aeioupcd"
被看作是包含第一个“P”,因为"aeioupcd".delete!("p")
返回“P”(而不是零)。 但是, delete!
还从这个字符"aeioupcd"
,所以在“PPCD”第二“P”中被评估"aeioucd".delete!("p") => nil
,所以“PPCD”未选中。
文章来源: Ruby select on array of arrays filtering with regex containing variable [closed]