Rails和Ruby之间的正则表达式有何不同?

时间:2013-11-08 15:45:22

标签: ruby-on-rails ruby regex irb

我尝试在网址末尾匹配'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个字母值,以+分隔)
  • 不匹配单个或超过2个字母的值(例如ABC),但保留2个字母的值(例如ABC+MN;保留MN

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

Rubular显示了重复应用模式的结果:

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

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

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