Comment puis-je traiter des caractères spéciaux tels que \ ^ $.? * | + () [{Dans mon regex?

Je veux faire correspondre un caractère spécial d’expression régulière , \^$.?*|+()[{ . J’ai essayé:

 x <- "a[b" grepl("[", x) ## Error: invalid regular expression '[', reason 'Missing ']'' 

(De ssortingngr::str_detect(x, "[") équivalente ssortingngr::str_detect(x, "[") ou ssortingngi::ssorting_detect_regex(x, "[") .)

Doubler la valeur pour y échapper ne fonctionne pas:

 grepl("[[", x) ## Error: invalid regular expression '[[', reason 'Missing ']'' 

Ni en utilisant une barre oblique inverse:

 grepl("\[", x) ## Error: '\[' is an unrecognized escape in character ssortingng starting ""\[" 

Comment faire correspondre les caractères spéciaux?


Quelques cas particuliers dans des questions qui sont assez anciennes et bien écrites pour qu’elles soient effrontées et se terminent en deux:
Périodes échappées dans R Expressions régulières
Comment échapper à un point d’interrogation dans R?
tuyau d’échappement (“|”) dans une regex

S’échapper avec un double backslash

R traite les barres obliques inverses comme des valeurs d’échappement pour les constantes de caractères . (et il en va de même pour les expressions régulières. Il faut donc deux barres obliques inverses pour fournir un argument de caractère à un motif. Le premier n’est pas un caractère, mais le rend plutôt un caractère.) comment ils sont traités en utilisant cat .

 y <- "double quote: \", tab: \t, newline: \n, unicode point: \u20AC" print(y) ## [1] "double quote: \", tab: \t, newline: \n, unicode point: €" cat(y) ## double quote: ", tab: , newline: ## , unicode point: € 

Pour en savoir plus: Échapper à une barre oblique inverse avec une barre oblique inverse dans R produit 2 barres obliques inverses dans une chaîne, pas 1

Pour utiliser des caractères spéciaux dans une expression régulière, la méthode la plus simple consiste généralement à leur échapper avec une barre oblique inverse, mais comme indiqué ci-dessus, la barre oblique inverse doit être échappée.

 grepl("\\[", "a[b") ## [1] TRUE 

Pour faire correspondre les barres obliques inverses, vous devez échapper deux fois, ce qui entraîne quatre barres obliques inverses.

 grepl("\\\\", c("a\\b", "a\nb")) ## [1] TRUE FALSE 

Le package rebus contient des constantes pour chacun des caractères spéciaux afin de vous éviter les barres obliques.

 library(rebus) OPEN_BRACKET ## [1] "\\[" BACKSLASH ## [1] "\\\\" 

Pour plus d'exemples, voir:

 ?SpecialCharacters 

Votre problème peut être résolu de cette façon:

 library(rebus) grepl(OPEN_BRACKET, "a[b") 

Former une classe de caractères

Vous pouvez également envelopper les caractères spéciaux entre crochets pour former une classe de caractères .

 grepl("[?]", "a?b") ## [1] TRUE 

Deux des caractères spéciaux ont une signification spéciale dans les classes de caractères: \ et ^ .

La barre oblique inverse doit encore être échappée même si elle se trouve dans une classe de caractères.

 grepl("[\\\\]", c("a\\b", "a\nb")) ## [1] TRUE FALSE 

Caret doit seulement être échappé s'il se trouve directement après le carré ouvrant.

 grepl("[ ^]", "a^b") # matches spaces as well. ## [1] TRUE grepl("[\\^]", "a^b") ## [1] TRUE 

rebus vous permet également de former une classe de caractères.

 char_class("?") ##  [?] 

Utiliser une classe de caractères préexistante

Si vous souhaitez faire correspondre toutes les ponctuations, vous pouvez utiliser la classe de caractères [:punct:] .

 grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$")) ## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

ssortingngi mappe à la catégorie générale d'Unicode pour la ponctuation, son comportement est donc légèrement différent.

 ssorting_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]") ## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE 

Vous pouvez également utiliser la syntaxe multi-plateforme pour accéder à un UGC.

 ssorting_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}") ## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE 

Utiliser \ Q \ E échappe

Placer des caractères entre \\Q et \\E fait que le moteur d'expression régulière les traite littéralement plutôt que comme des expressions régulières.

 grepl("\\Q.\\E", "ab") ## [1] TRUE 

rebus vous permet d'écrire des blocs littéraux d'expressions régulières.

 literal(".") ##  \Q.\E 

N'utilisez pas d'expressions régulières

Les expressions régulières ne sont pas toujours la réponse. Si vous voulez faire correspondre une chaîne fixe, vous pouvez le faire, par exemple:

 grepl("[", "a[b", fixed = TRUE) ssortingngr::str_detect("a[b", fixed("[")) ssortingngi::ssorting_detect_fixed("a[b", "[") 

Je pense que la manière la plus simple de faire correspondre les caractères

 \^$.?*|+()[ 

utilisez des classes de caractères de R. Considérez les éléments suivants pour nettoyer les en-têtes de colonne d’un fichier de données, qui peut contenir des espaces et des caractères de ponctuation:

 > library(ssortingngr) > colnames(order_table) <- str_replace_all(colnames(order_table),"[:punct:]|[:space:]","") 

Cette approche nous permet de chaîner des classes de caractères pour correspondre aux caractères de ponctuation, en plus des caractères d'espacement, quelque chose que vous devriez normalement échapper avec \\ pour détecter. Vous pouvez en apprendre plus sur les classes de caractères sur cette feuille de saisie ci-dessous, et vous pouvez également taper ?regexp pour voir plus d'informations à ce sujet.

https://www.rstudio.com/wp-content/uploads/2016/09/RegExCheatsheet.pdf