我尝试在网址末尾匹配'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
)答案 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代码与上述正则表达式不同。