Версия gsub без регулярных выражений в Ruby

Я ищу версию gsub, которая не пытается интерпретировать свой ввод как регулярные выражения и использует обычные C-подобные экранированные строки.

Обновить

Вопрос был инициирован странным поведением:

text.gsub("pattern", "\\\\\\")

а также

text.gsub("pattern", "\\\\\\\\")

рассматриваются как одинаковые и

text.gsub("pattern", "\\\\")

рассматривается как одна обратная косая черта.


person Paul    schedule 28.03.2013    source источник


Ответы (2)


Есть два уровня экранирования для второго параметра gsub:

Первый слой представляет собой строковую константу Ruby. Если он написан как \\\\\\, Ruby не экранирует его, как \\\

второй уровень — это сам gsub: \\\ обрабатывается как \\ + \

двойная обратная косая черта разрешается в одинарную: \\ => \, а одиночная обратная косая черта в конце разрешается как сама по себе.

Аналогичным образом разбираются 8 обратных слэшей:

"\\\\\\\\" => "\\\\"

а потом

"\\\\" => "\\"

поэтому константы, состоящие из шести и восьми обратных косых черт, разрешаются в две обратные косые черты.

Чтобы немного облегчить жизнь, в функции gsub можно использовать блок. Строковые константы в блоке передаются только через слой Ruby (спасибо @Sorrow).

"foo\\bar".gsub("\\") {"\\\\"}
person Paul    schedule 17.04.2013

gsub принимает строки в качестве первого параметра:

the pattern is typically a Regexp; if given as
a String, any regular expression metacharacters
it contains will be interpreted literally

Пример:

"hello world, i am thy code".gsub("o", "-foo-")
=> "hell-foo- w-foo-rld, i am thy c-foo-de"
person Miki    schedule 28.03.2013
comment
Тогда почему для замены на два обратных слэша \\ я должен написать ШЕСТЬ обратных слэшей? \\\\\\ См. здесь: stackoverflow.com/ вопросы/1542214/ - person Paul; 28.03.2013
comment
не совсем уверен, что вы имеете в виду... "foo\\\\bar".gsub("\\\\", "-") приводит к "foo-bar" (также "foo\\\\bar".count('\\') == 2), пока вы работаете со строками, то есть... если вы делаете это наоборот (замените что-то двумя \s) - ответ в теме, на которую вы ссылаетесь (ужасные подробности;); по этой причине (и по другим причинам ясности) я бы рекомендовал вам использовать синтаксис блока gsub вместо двух параметров - person Miki; 28.03.2013
comment
Попробуйте заменить одинарную обратную косую черту на двойную обратную косую черту, и вы увидите. - person Paul; 28.03.2013
comment
да, это не работает, когда вы используете два аргумента для gsub, но работает, когда вы используете вызов блока: "foo\\bar".gsub("\\") {"\\\\"} - person Miki; 28.03.2013