Je voudrais utiliser gsub
pour remplacer chaque occurrence d'une barre oblique inverse dans une chaîne par 2 barres obliques inverses.
Actuellement, ce que j'ai essayé, c'est gsub("\\\\", "\\", x)
. Cela ne semble cependant pas fonctionner. Cependant, si je change l'expression pour remplacer chaque barre oblique inverse par "a", cela fonctionne très bien.
> gsub("\\\\", "\\", "\\")
[1] ""
> gsub("\\\\", "a", "\\")
[1] "a"
> gsub("\\\\", "\\\\", "\\")
[1] "\\"
Le dernier caractère n'est qu'une seule barre oblique inverse; R imprime simplement 2 car il imprime les caractères échappés avec la barre oblique inverse. L'utilisation de nchar
confirme que la longueur est 1.
Qu'est-ce qui cause cette fonctionnalité? Le deuxième argument de gsub
n'est pas une expression régulière, donc avoir 4 barres obliques inverses dans le littéral de chaîne doit être converti en un caractère avec 2 barres obliques inverses. Il est encore moins logique que le premier appel gsub
ci-dessus renvoie une chaîne vide.
Voici ce dont vous avez besoin:
gsub("\\\\", "\\\\\\\\", "\\")
[1] "\\\\"
La raison pour laquelle vous avez besoin de quatre barres obliques inverses pour représenter une barre oblique inverse littérale est que "\"
est un caractère d'échappement dans les deux chaînes R et pour le moteur d'expression régulière à laquelle vous passez finalement vos modèles. Si vous parliez directement au moteur d'expression régulière, vous utiliseriez "\\"
pour indiquer une barre oblique inverse littérale. Mais pour que R passe "\\"
sur le moteur d'expression régulière, vous devez taper "\\\\"
.
(Si vous souhaitez simplement doubler les barres obliques inverses, vous pouvez utiliser ceci à la place):
gsub("\\", "\\\\", "\\", fixed=TRUE)
[1] "\\\\"