ruby rspec и сравнение строк - PullRequest
16 голосов
/ 24 апреля 2011

Я не эксперт по рубинам, и, возможно, это покажется глупым вопросом ... но я слишком взволнован по поводу странности (я думаю), которую я нашел в RSpec matcher под названием 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 Ответ

12 голосов
/ 24 апреля 2011

То, что вы видите, - это различная интерпретация символов, экранированных обратной косой чертой, в String и Regexp. В мягкой (") строке в кавычках \* становится *, но /\*/ на самом деле является обратной косой чертой, за которой следует звезда.

Если вы используете жесткие кавычки (') для объектов String или , то удваивайте символы обратной косой черты (хотя только для строк), тогда ваши тесты должны давать те же результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...