2012-07-24 56 views
1

如何在Ruby字符类中说“除了反斜杠之外的所有符号”?正则表达式匹配除反斜线之外的任何字符

/'[^\]*'/.match("'some string \ hello'") => should be nil 

变两个反斜杠不起作用

/'[^\\]*'/.match("'some string \ hello'") => 'some string \ hello' BUT should be nil 
+1

Ruby的正则表达式调试一个很好的资源是:http://rubular.com/ – Teddy 2012-07-24 20:31:42

+0

是的,尤其是当IRB不可 – 2012-07-24 20:55:03

回答

7

你的问题不在于你的正则表达式;你说对了。你的问题是你的测试字符串没有反斜杠。它有一个逃脱的空间,相反。试试这个:

str = "'some string \\ hello'" 
puts str     #=> 'some string \ hello' 
p /'[^\\]*'/.match(str) #=> nil 
3

您需要转义反斜线:

[^\\]* 

因为反斜线在正则表达式的转义字符,从而逃避关闭括号在这里。

如果您想验证整个字符串包含非反斜杠字符,那么你需要锚:

^[^\\]*$ 
+0

我试了一下之前e写这个问题,但它不起作用。 (红宝石1.9.2) – 2012-07-24 20:39:09

+0

那么,它会匹配反斜杠 – Joey 2012-07-24 20:40:18

+0

之前的部分*,它匹配整个字符串,我添加了单引号以显示它 – 2012-07-24 20:46:08

3

实际上在你的字符串中没有反斜杠来匹配。尝试采取一看只是你输入:

"'some string \ hello'".length # => 20 
"a\ b".length # => 3 

的“\”在双引号被转义成只是一个空间:

irb(main):014:0> " "[0].to_i # => 32 
irb(main):015:0> "\ "[0].to_i # => 32 
irb(main):016:0> "\ ".size #=> 1 

如果你想匹配没有斜线,你需要二,就像你的第二个例子,这对我来说很好:

/'[^\\]*'/.match("'some string \\ hello'") # => nil 
相关问题