【问题标题】:ruby regex split difficulties, close but not quite红宝石正则表达式拆分困难,接近但不完全
【发布时间】:2010-10-22 22:06:34
【问题描述】:

我在 ruby​​ 中使用正则表达式将字符串沿多个分隔符拆分时遇到了很大的困难,这些分隔符是:

  • ,
  • /
  • &

这些定界符中的每一个都可以在定界符的任一侧有任意数量的空白,但每个项目都可以包含一个有效的空格。 我一直在测试的一个很好的例子是字符串1, 2 /3 and 4 12

我想要的是 "1, 2 /3 and 4 12".split(regex) =>["1", "2", "3", "4 12"] 周围的东西

我能得到的最接近的是/\s*,|\/|&|and \s*/,但这会生成["1", " 2 ", "3 ", "4 12"],而不是预期的结果。

意识到这非常接近,我可以简单地修剪每件物品,但是如此接近并且知道可以做到这一点有点让我发疯。希望有人可以帮助我避免这种疯狂。

【问题讨论】:

    标签: ruby regex split


    【解决方案1】:
    /\s*,|\/|&|and \s*/
    

    这会解析为/(\s*,)|\/|&|(and \s*)/。 IE。前导 \s* 仅适用于逗号,尾随 \s* 仅适用于“and”。你想要:

    /\s*(,|\/|&|and )\s*/
    

    或者,为了避免捕获:

    /\s*(?:,|\/|&|and )\s*/
    

    【讨论】:

    • 我知道我很接近了!我不熟悉?:,我想这就是诀窍。没有?: 就不会返回正确的结果。谢谢,现在我需要去查找什么?:是的
    • @Apeiron: ?: 只是让该组不被捕获。在这种情况下,这意味着括号匹配的部分不会出现在split的结果中。
    【解决方案2】:

    试试.scan:

    irb(main):030:0> "1, 2 /3 and 4 12".scan(/\d+(?:\s*\d+)*/)
    => ["1", "2", "3", "4 12"]
    

    【讨论】:

      【解决方案3】:

      你可以试试:

      (?:\s*)[,\/](?:\s*)|(?:\s*)and(?:\s*)
      

      但正如 Nakilon 建议的那样,扫描而不是拆分可能会更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-14
        • 2019-04-22
        • 2011-10-06
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多