2012-02-07 52 views
0

我得到一個警告和一個錯誤:此行支架/的括號中的Ruby正則表達式

rubytime.rb:18: warning: character class has `[' without escape 
rubytime.rb:18: unmatched): /^(\w+).*\([([\d]+)\+]?(\d\d):(\d\d)\)\s*$/ 

if line =~ /^(\w+).*\([([\d]+)\+]?(\d\d):(\d\d)\)\s*$/ 

我檢查了幾次,在括號/括號似乎排隊,雖然也許(最近做完perl)我在Ruby中對Regexps做出了一個錯誤的假設。

+0

爲什麼嵌套括號?你期望數據中有括號嗎? – schtever 2012-02-07 03:29:09

+0

我在http://tryruby.org上發現了任何運行此錯誤的錯誤。你能否提供代碼無法工作的要點或pastebin? – rajasaur 2012-02-07 03:35:45

+0

你打算用[[([\ d] +)\ +]來做什麼?你不能嵌套字符類。這是錯誤告訴你的。 – 2012-02-07 03:45:06

回答

2
[([\d]+)\+]? 

你的意思是......

(([\d]+)\+)? 

此外,[\d]相當於\d,所以你真的可以把它寫成...

((\d+)\+)? 

如果你不想要外部組是一個匹配組,您可以使用不匹配的(?:)

(?:(\d+)\+)? 
+0

最後一個是Chris最可能尋找的。幾乎是我想要建議的。直覺上,我認爲這是他想要完成的。 '(?:((\ d +)\ +)?'讓我們來看看。 – kikuchiyo 2012-02-07 03:51:31

+0

第一個序列,如果它存在(也可能不是),則爲1或更多數字,後跟一個文字+。最後一個會完成那個嗎?我想我在以後不打算使用組(通過$ 1,$ 2等)時會對分組感到困惑。 – Chris 2012-02-07 06:40:19

+0

是的,最後的版本會匹配。 '\ d +'是一個或多個數字; '\ +'是一個字面加號,'(?:)'是一個非捕捉組,與'()'相同,但不添加捕捉。 – Amber 2012-02-07 06:50:35

0

如果需要字面括號,你需要躲避他們的。 \[ \]。未轉義的括號開始「字符類」,如[abc],它接受abc。這些不能嵌套。