2011-04-24 65 views
14

我不是一个红宝石专家,可能这似乎是一个愚蠢的问题......但我太奇怪了(我认为)我在RSpec匹配器中找到了一个叫做match的东西。ruby​​ rspec和字符串比较

你知道match需要输入一个字符串或正则表达式。例如:

"*test*".should match "*test*" #=> will fail throwing a regex exception 

这意味着(我认为)是输入字符串解释为正则表达式的话,我应该逃避特殊的正则表达式:

"test".should match "test" #=> will pass 
"test".should match /test/ #=> will pass 

当您插入输入字符串特殊的正则表达式字符奇怪开始字符,使其工作:

"*test*".should match "\*test\*" #=> will fail with same exception 
"*test*".should match /\*test\*/ #=> will pass 

从这个基本的测试,据我所知,match会将输入的字符串为正则表达式,但它不允许您转义特殊的正则表达式字符。

我是真的吗?这不是一个奇怪的行为吗?我的意思是,这是一个字符串或正则表达式!


编辑后回答:

继DigitalRoss(右)回答以下测试通过:

"*test*".should match "\\*test\\*" #=> pass 
"*test*".should match '\*test\*' #=> pass 
"*test*".should match /\*test\*/ #=> pass 

回答

10

你们看到的是反斜杠转义字符的字符串不同的解释VS正则表达式。在软(“)引用的字符串,\*成为*,但/\*/确实是一个反斜杠后跟一个明星。

如果使用硬引号(')的字符串对象双反斜杠字符(只对于字符串,虽然)那么你的测试应该产生相同的结果。

+0

谢谢,你是对的。我编辑与你提到的代码测试的问题。 – 2011-04-24 18:04:46

+1

你也可以逃脱正则表达式如字符串,如 %R {\\ * test \\ *} 对此没有太大用处,因为您仍然需要反斜杠,但是在匹配/ – Ghoti 2013-02-11 11:07:39

+0

时发现它非常重要,但我遇到了类似的问题 - 例如,我的字符串比较包含转义字符,例如'\ nsome text \ n'。使用双引号固定以防止rspec双重转义。 – lfender6445 2014-01-06 15:26:33