【问题标题】:Filter array with an array of regex使用正则表达式数组过滤数组
【发布时间】:2013-12-03 09:00:05
【问题描述】:

我正在使用 Ruby 1.9.2p320 并运行以下代码 sn-p:

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"]

我得到该输出的任何特殊原因?我怎样才能得到预期的输出?

【问题讨论】:

  • 我使用 Ruby 版本 2.0.0p247 进行了测试。结果相同。不知道为什么会这样。

标签: ruby regex arrays


【解决方案1】:

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

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"]/

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

/["abc_1", "xyz_1"]/

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

【讨论】:

  • 我让我的代码 sn-p 工作,但我不明白解释。您能否详细说明或给我一个参考或链接。谢谢
  • 我已经添加了角色类描述的链接,希望对您有所帮助。
【解决方案2】:

试试这个:

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

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

【讨论】:

    【解决方案3】:

    根据您的问题,以上两个答案都很好。

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

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

    与使用 grep 的答案相同且更简单

    【讨论】:

    • 对不起,忘了说。我想获得具有特定前缀的数组的子集。在这种情况下,您的方法将不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2021-08-19
    • 2013-06-25
    • 1970-01-01
    • 2021-03-25
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多