R - gsub, заменяющий обратную косую черту

regex r gsub

17959 просмотра

1 ответ

1171 Репутация автора

Я хотел бы использовать gsubдля замены каждого вхождения обратной косой черты в строке с двумя обратными косыми чертами.

В настоящее время я попробовал это gsub("\\\\", "\\", x). Это, похоже, не работает, хотя. Тем не менее, если я изменю выражение, чтобы вместо каждой обратной косой черты заменить на «а», оно будет работать нормально.

> gsub("\\\\", "\\", "\\")
[1] ""
> gsub("\\\\", "a", "\\")
[1] "a"
> gsub("\\\\", "\\\\", "\\")
[1] "\\"

Последний символ - это только один обратный слеш; R просто печатает 2, потому что он печатает экранированные символы с обратной косой чертой. Использование ncharподтверждает, что длина равна 1.

Что вызывает эту функциональность? Второй аргумент gsubне является регулярным выражением, поэтому наличие 4-х обратных косых черт в строковом литерале должно быть преобразовано в символ с 2-мя обратными слешами. Еще менее важно, что первый gsubприведенный выше вызов возвращает пустую строку.

Автор: Jon Claus Источник Размещён: 15.12.2014 07:51

Ответы (1)


30 плюса

135212 Репутация автора

Решение

Вот что вам нужно:

gsub("\\\\", "\\\\\\\\", "\\")
[1] "\\\\"

Причина, по которой вам нужно четыре обратных слеша для представления одного буквального обратного слеша, заключается в том, что "\"это escape-символ как в R-строках, так и для механизма регулярных выражений, которому вы в конечном итоге передаете свои шаблоны. Если бы вы говорили напрямую с движком регулярных выражений, вы бы "\\"указали буквальный обратный слеш. Но для того, чтобы R перешел "\\"к движку регулярных выражений, вам нужно набрать "\\\\".


(Если вы просто хотите удвоить обратную косую черту, вы можете использовать это вместо этого):

gsub("\\", "\\\\", "\\", fixed=TRUE)
[1] "\\\\"
Автор: Josh O'Brien Размещён: 15.12.2014 07:57
32x32