红宝石阵列上与正则表达式包含可变滤波的阵列选择[关闭](Ruby select on array o

2019-10-29 20:47发布

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的重复实例。

Answer 1:

[]在一个正则表达式表示字符类。 它匹配一个字符,在它的任何字符。 因此,它的结论,即包含A,E,I,O,U,P,C或D的任何单词。

目前尚不清楚你真正虽历经......你说什么AP,C,要求D,同时也让元音,但没有任何其他的辅音? 如果是的话,我会说这是最简单的使用两个正则表达式。 一看到,如果你需要的字母都存在,而另一个以确保它仅包含字母,你允许。

而对于所有神圣...使用=~

examp.select do |a|
  a[0] =~ /#{word}/ && a[0] =~ /^[#{word}aeiou]+$/
end


Answer 2:

我假定的问题是,“选择所有阵列[str]examp的量,字符串的所有字符stra, 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]