0

我正在尝试匹配'MN+WI'URL 末尾的值,例如/foos/MN+WI. 该模式在 rubular.com 上[a-zA-Z][\+\,]?产生匹配结果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 字母值,由 a 分隔+
  • 不匹配单个或多于 2 个字母的值(例如ABC),但保留 2 个字母的值(例如ABC+MN; keep MN
4

3 回答 3

2

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

于 2013-11-08T15:57:09.470 回答
2

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

于 2013-11-08T15:59:43.900 回答
1

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

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

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

您的 IRB 代码返回一个匹配项。不过,还要注意,由于包含{2}.

于 2013-11-08T15:59:36.327 回答