Unicode Ruby 1.9 в Regexp

Я только что обновил старый проект до Ruby 1.9.3. У меня куча проблем со строками Unicode. Это сводится к:

p = "\\username"; "Any String".match(/#{p}/)

Это работает в 1.8, и возвращает ноль, как ожидалось. Тем не менее, в 1.9 это бросает:

ArgumentError: invalid Unicode escape

Я пытаюсь соответствовать '\u' в строке. Я думал, что обратная косая черта избежит регистрации в качестве юникода.

Что мне здесь не хватает?

Редактировать: одинарные кавычки тоже не работают:

1.9.3p429 :002 > p = '\\username'; "Any String".match(/#{p}/)
ArgumentError: invalid Unicode escape
from (irb):2

1 ответ

Когда вы делаете /#{p}/ это значит p будет интерпретироваться как регулярное выражение. Так как ваш p теперь равно \username, тогда эта компиляция Regexp не удастся (так как это недопустимая escape-последовательность Unicode):

>> Regexp.new "\\username"
RegexpError: invalid Unicode escape: /\username/

Т.е. делать /#{p}/ равно писать /\username/,

Поэтому ты должен сбежать p из любых регулярных выражений, поэтому он будет правильно интерпретирован:

"Any String".match(/#{Regexp.escape(p)}/)

Или просто:

"Any String".match(Regexp.escape(p))
Другие вопросы по тегам