Использование Ruby gsub со строкой, содержащей \0

У меня проблемы с правильным использованием gsub:

Учитывая этот код:

"replace me".gsub(/replace me/, "this \\0 is a test")

Результат:

 "this replace me is a test" 

Но то, что я ожидаю, это:

"this \0 is a test"

Как использовать gsub для получения желаемого результата?


person Frank    schedule 27.07.2010    source источник
comment
\0 — это обратная ссылка, которая заменяется всем совпадением, и это не уникально для Ruby. (Обычно вы видите их как \1, \2 и т. д. \0 реже)   -  person Paige Ruten    schedule 27.07.2010
comment
Когда '\0' встречается в одинарных кавычках (как обычно последний параметр для gsub), он эквивалентен "\\0" в двойных кавычках, поскольку у вас не может быть никакой управляющей последовательности, кроме '\\' или '\'' в одинарных кавычках.   -  person Adrian    schedule 27.07.2010


Ответы (1)


Экранируйте его еще одним обратным слэшем, чтобы gsub знал, что вы хотите "\\0".

"replace me".gsub(/replace me/, "this \\\\0 is a test")

(Изменить), если под "\0" вы имели в виду байт 0x00, сделайте следующее:

"replace me".gsub(/replace me/, "this \0 is a test")
person Adrian    schedule 27.07.2010
comment
Нет, я не имел в виду \0 как байт 0x00 - person Frank; 27.07.2010
comment
Скажем, у меня есть строка string = 'this \0 is a test', и я хочу использовать эту строку в качестве второго аргумента для gsub. Будет ли работать string.gsub(/\\/,'\\\\')? Как избежать string, чтобы \0 не заменялось совпадением? - person Frank; 27.07.2010
comment
Если замещающий текст не является строковым литералом, который вы не можете экранировать во время кодирования, то это будет экранировать их: string.gsub!(/(\\\d)/,'\\\\\1') — в строке замены пять косых черт. Каждые два становятся единицей в фактической строке, поэтому gsub видит \\\1, означающее одну обратную косую черту, за которой следует первое совпадение регулярного выражения \\\d. Это сама по себе одна обратная косая черта, за которой следует цифра. Итак, скажем, входная строка содержит \0, она будет преобразована в \\0 или буквально две обратные косые черты, за которыми следует цифра ноль. - person starfry; 30.07.2015