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))