【问题标题】:Difference in regex between Rails and Ruby?Rails和Ruby之间正则表达式的区别?
【发布时间】:2013-11-08 15:45:21
【问题描述】:

我正在尝试匹配 URL 末尾的 'MN+WI' 之类的值,例如 /foos/MN+WI。模式 [a-zA-Z][\+\,]? 在 rubular.com 上产生匹配结果 MN+WI,但在 IRB 中:

s="MI+WI"
p="[a-zA-Z]{2}[\+\,]?"
r=Regexp.new(p)
r.match(s) # => #<MatchData "MI+"> 

Ruby 控制台中的行为与我在 Rails 中遇到的情况一致。两者有区别吗?我需要如何调整我的正则表达式模式?

$ ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.3.0]

$ rails -v
Rails 4.0.0

** 编辑 **

原始模式应该是[a-zA-Z]{2}[\+\,]?

我真正需要让路线识别任何这些变化并将其分配给参数:

  • MN(工作中)
  • mn(工作中)
  • MN+WI(不工作)
  • MN+WI+IA(任意两个字母的数值,用+分隔)
  • 不匹配单个或超过 2 个字母的值(例如 ABC),但保留 2 个字母的值(例如 ABC+MN;保留 MN

【问题讨论】:

  • Rails 在 Ruby 上运行,所以它们应该是一致的:p
  • [a-zA-Z][\+\,]? 与 MN+WI 不匹配。

标签: ruby-on-rails ruby regex irb


【解决方案1】:

正如我在评论中所说,[a-zA-Z][\+\,]? 与 MN+WI 不匹配。您在 Rubular 上看到的实际上是两场比赛。第一个匹配是MN+,第二个匹配是WI。 Rubular 只是突出显示所有匹配项,因此看起来像是一场长匹配,但实际上是两场匹配。 Rubular 和您的本地 Ruby 安装之间的行为应该是一致的。

【讨论】:

    【解决方案2】:

    您的正则表达式表示“2 个字母后跟 可选 + 或”。所以你的字符串有2个匹配项。 Rubular 高亮所有匹配,看起来整个字符串都匹配,但实际上有 2 个不同的匹配 = MN+ 和 WI

    【讨论】:

      【解决方案3】:

      Rubular 正在显示重复应用该模式的结果:

      [a-zA-Z][\+\,]?
      

      如果您将该模式放在捕获组中,您将看到每个单独的匹配项(请参阅http://rubular.com/r/h5iBa5k0fr),每个匹配项都匹配一个字符,N+ 除外。

      您的 IRB 代码返回一个匹配项。但请注意,由于您包含了{2},因此您的 IRB 代码与上述正则表达式不同。

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 2010-10-09
        • 2012-06-01
        • 2013-09-18
        • 2016-11-18
        • 2012-02-22
        • 1970-01-01
        • 2013-12-17
        相关资源
        最近更新 更多