我不是 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
最佳答案
您看到的是字符串与正则表达式中反斜杠转义字符的不同解释。在软 (") 引号字符串中,\*
变为 *
,但 /\*/
实际上是一个反斜杠后跟一个星号。
如果您对字符串对象使用硬引号 (') 或将反斜杠字符加倍(尽管仅适用于字符串),那么您的测试应该会产生相同的结果。
关于ruby rspec 和字符串比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5772122/