Ruby RSpec和字符串比较

16

我不是 Ruby 专家,可能这个问题看起来很傻...但我对 RSpec 匹配器叫做 match 发现了一个奇怪的事情(我认为)。

你知道 match 接受一个字符串或正则表达式作为输入。例如:

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

当您在输入字符串中插入特殊的正则表达式字符时,情况就变得奇怪了:

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

这意味着(我认为)输入的字符串被解释为正则表达式,因此我应该转义特殊的正则表达式字符以使其起作用:

"*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
1个回答

13

你所看到的是在字符串和正则表达式中反斜杠转义字符不同的解释方式。在软引用的字符串中,\* 变成了 * ,但是 /\*/ 真正代表的是一个反斜杠后跟一个星号。

如果你对于 String 对象使用硬引用 (') 或者双倍反斜杠字符(仅限于字符串),那么你的测试应该会产生相同的结果。


谢谢,你是对的。我已经编辑了问题,并加入了你提到的代码测试。 - Emiliano Poggi
1
你也可以转义正则表达式字符串,例如 %r{\test\}。在这种情况下并不是很有用,因为你仍然需要反斜杠,但是当匹配 / 时,它非常有用。 - Ghoti
虽然与此轻微相关,但我遇到了类似的问题——我的问题涉及包含转义字符的字符串比较,例如`\nsome text\n'。使用双引号修复可以防止rspec双重转义。 - lfender6445

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接