2012-04-28 83 views
0

取这个字符串。Ruby扫描正则表达式不匹配

a = "real-ab(+)real-bc(+)real-cd-xy" 
a.scan(/[a-z_0-9]+\-[a-z_0-9]+[\-\[a-z_0-9]+\]?/) 
=> ["real-ab", "real-bc", "real-cd-xy"] 

但是,下一个字符串怎么会变成什么?

a = "real-a(+)real-b(+)real-c" 
a.scan(/[a-z_0-9]+\-[a-z_0-9]+[\-\[a-z_0-9]+\]?/) 
=> [] 

我怎样才能让它输出到3计数数组?

回答

3

你混淆了括号(用于分组)和方括号(用于字符类)。你想要

a.scan(/[a-z_0-9]+-[a-z_0-9]+(?:-[a-z_0-9]+)?/) 

(?:...)创建一个非捕获组,这就是你需要在这里。

而且,除非你想明确禁止大写字母,你可以写\w作为“一个字母,数字或下划线”的简写:

a.scan(/\w+-\w+(?:-\w+)?/) 
0
a.scan(/[a-z_0-9]+\-[a-z_0-9]+/) 
+0

完全不会匹配'real-cd-xy'。 – 2012-04-28 21:49:43

+0

'/ [ - a-z_0-9] + /'will。 – mkjeldsen 2012-04-28 21:51:18

0

为什么就不能?

a.scan(/[a-z_0-9\-]+/) 
+0

也许吧。但它也会匹配一个不包含任何破折号的字符串,并且在他的正则表达式中它们不是可选的。或者像'---'或'real-'或'-real'这样的字符串,它们的第一个正则表达式都不合法。 – 2012-04-28 21:53:52