使用正则表达式数组过滤数组

时间:2013-12-03 09:00:05

标签: ruby regex arrays

我正在使用Ruby 1.9.2p320并运行以下代码片段:

a = ["abc", "def", "pqr", "xyz"]
z = ["abc", "xyz"]
a.grep(/#{z}/)

这给出了这个输出:["abc", "xyz"]

a = ["abc_1", "def_1", "pqr_1", "xyz_1"]
z = ["abc_1", "xyz_1"]
a.grep(/#{z}/)

但是这会将输出显示为:["abc_1", "def_1", "pqr_1", "xyz_1"]

我的预期只是["abc_1", "xyz_1"]

为什么我得到那个输出的任何特殊原因?我怎样才能获得预期的输出?

3 个答案:

答案 0 :(得分:5)

您正在以错误的方式构建正则表达式,您应该执行以下操作:

a = ["abc_1", "def_1", "pqr_1", "xyz_1"]
z = ["abc_1", "xyz_1"]

a.grep(Regexp.union(z))
# => ["abc_1", "xyz_1"]

您的第一个示例似乎有效,因为#{z}被插值为以下表达式:

/["abc", "xyz"]/

这是仅与"abc""xyz"匹配的chararcters class。在第二个示例中,#{z}被视为以下字符类:

/["abc_1", "xyz_1"]/

匹配数组中的所有字符串,因为它们都包含字符1

答案 1 :(得分:3)

试试这个:

a.grep(/#{z.join('|')}/)
# => ["abc_1", "xyz_1"]

它创建有效的正则表达式 - 使用正则表达式“或”语句 - /abc_1|xyz_1/

答案 2 :(得分:2)

根据你的问题,上面的答案都完全没问题。

但是如果您正在使用数组,为什么不使用&运算符

a = ["abc_1", "def_1", "pqr_1", "xyz_1"]
z = ["abc_1", "xyz_1"]
a & z
=> ["abc_1", "xyz_1"]

与使用grep和simpler

相同的答案