我正在使用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"]
。
为什么我得到那个输出的任何特殊原因?我怎样才能获得预期的输出?
答案 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
相同的答案