【问题标题】:Using regex to find an exact pattern match in Ruby使用正则表达式在 Ruby 中查找精确的模式匹配
【发布时间】:2011-07-15 23:02:39
【问题描述】:

我将如何使用正则表达式测试完全匹配。

"car".match(/[ca]+/) 返回 true。

由于正则表达式模式不包含“r”,我如何让上述语句返回 false?任何包含“c”和“a”以外的字符的字符串都应该返回 false。

“acacaccc”应该返回true

“acacacxcc”应该返回false

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    为其添加一些锚点:

    /^[ca]+$/
    

    【讨论】:

    • 否:"c\nX".match(/^[ca]+$/).
    • 这个锚点不正确。请参阅 Chris Heald 回答的 cmets。
    【解决方案2】:

    你只需要锚点。

    "car".match(/^[ca]+$/)
    

    这将强制整个字符串由“c”或“a”组成,因为“^”和“$”表示字符串的“开始”和“结束”。没有它们,只要匹配字符串的任何部分,正则表达式就会成功。

    【讨论】:

    • 这会在 "caca\nrabbits" 等字符串上中断。正确的锚点是 \A 和 \Z
    • @cam:其实你想要的是\z,而不是\Z,否则你会错过"c\n"。
    • 正如@cam 所指出的,^ 和$ 表示行 的开始和结束,而不是字符串。请注意,这在许多语言中是不同的。
    【解决方案3】:

    扭转你的逻辑,寻找不好的东西:

    string.match(/[^ca]/)
    string.index(/[^ca]/)
    

    如果以上任何一个都不是零,那么你有一个错误的字符串。如果你只是想测试而不关心它在哪里匹配,那么:

    if string.index(/[^ca]/).nil?
        # You have a good string
    else
        # You have a bad string
    

    例如:

    >> "car".index(/[^ca]/).nil?
    => false
    >> "caaaacaac".index(/[^ca]/).nil?
    => true
    

    【讨论】:

      【解决方案4】:

      试试这个

      "car".match /^(a|c)+$/
      

      【讨论】:

        【解决方案5】:

        试试这个:

        "car".match(/^(?:c|a)$/)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-13
          • 2012-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多