2011-04-24 45 views
14

私はルビーの専門家ではありませんが、これは愚かな質問と思われるかもしれません...しかし、私はマッチと呼ばれるRSpec matcherで見つけた奇妙なことについてはあまりにも嫌です。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扱い入力文字列を理解し、それはしていません特別な正規表現文字をエスケープすることができます。

本当ですか?これは単なる行動ではありませんか?つまり、文字列か正規表現です! ANSWER AFTER


EDIT:DigitalRoss後

(右)渡された次のテストに答える:

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

答えて

10

あなたが見ていることは正規表現対文字列でバックスラッシュでエスケープ文字の異なる解釈であります。ソフト( ")引用符で囲まれた文字列では、\**なるが、/\*/は本当に星が続くバックスラッシュである。

あなたは(唯一の文字列がまたは二重のバックスラッシュ文字をオブジェクトのために懸命に引用符( ')を使用した場合文字列のために、しかし)それから、あなたのテストでは、同じ結果を生成しなければならない。

+0

おかげで、あなたが正しいです。私はあなたが言及したコードのテストと質問を編集しました。 –

+1

ます。また、文字列のような正規表現逃れることができ、例えば %rを{\\ * test \\ *} バックスラッシュは依然として必要ですが、/ – Ghoti

+0

と軽く関連する場合は非常に重要ですしかし、私は同様の問題に遭遇しました。私はエスケープされた文字を含む文字列比較の周りにありました。たとえば、\ nsome text \ nです。 rspecが二重エスケープするのを防ぐために二重引用符で固定されています。 – lfender6445