2012-04-28 55 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