Это на самом деле особый случай интерполяции строк с глобальными переменными и переменными экземпляра, о которых большинство, похоже, не знают. Поскольку интерполяция строк также происходит в регулярном выражении в Ruby, я проиллюстрирую ниже строки (поскольку они предоставляют более простой пример):
@foo = "instancefoo"
$foo = "globalfoo"
"#@foo" # => "instancefoo"
"#$foo" # => "globalfoo"
Таким образом, вам нужно экранировать #
, чтобы предотвратить его интерполяцию:
/[~!@\#$%^&*()]+/
Единственный известный мне способ создания неинтерполированного регулярного выражения в Ruby - это строка (примечание одинарные кавычки):
Regexp.new('[~!@#$%^&*()]+')