Ошеломленный простым регулярным выражением - PullRequest
7 голосов
/ 29 февраля 2012

Я пытаюсь увидеть, содержит ли строка s какой-либо из символов в регулярном выражении.Приведенное ниже регулярное выражение прекрасно работает на rubular .

s = "asd#d"
s =~ /[~!@#$%^&*()]+/

Но в Ruby 1.9.2 выдается следующее сообщение об ошибке:

syntax error, unexpected ']', expecting tCOLON2 or '[' or '.'
s = "asd#d"; s =~ /[~!@#$%^&*()]/

Что не так?

Ответы [ 3 ]

12 голосов
/ 29 февраля 2012

Это на самом деле особый случай интерполяции строк с глобальными переменными и переменными экземпляра, о которых большинство, похоже, не знают. Поскольку интерполяция строк также происходит в регулярном выражении в Ruby, я проиллюстрирую ниже строки (поскольку они предоставляют более простой пример):

@foo = "instancefoo"
$foo = "globalfoo"
"#@foo" # => "instancefoo"
"#$foo" # => "globalfoo"

Таким образом, вам нужно экранировать #, чтобы предотвратить его интерполяцию:

/[~!@\#$%^&*()]+/

Единственный известный мне способ создания неинтерполированного регулярного выражения в Ruby - это строка (примечание одинарные кавычки):

Regexp.new('[~!@#$%^&*()]+')
1 голос
/ 29 февраля 2012

Мне удалось повторить это поведение в 1.9.3p0. Очевидно, есть проблема с комбинацией '# $'. Если вы убегаете либо это работает. Если вы измените их, это сработает:

s =~ /[~!@$#%^&*()]+/

Редактировать: в Ruby 1.9 #$ вызывает интерполяцию переменных, даже если за ними следует %, которое не является допустимым именем переменной.

0 голосов
/ 29 февраля 2012

Я не согласен, вам нужно экранировать символ $, символ конца строки.

s =~ /[~!@#\$%^&*()]/ => 3

Это правильно.

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