tutorial test solo regulares regular numeros expresiones expresion especiales espacio ejemplos cualquier caracteres caracter blanco alfanumerico regex r r-faq

regex - test - expresiones regulares tutorial



¿Cómo trato con caracteres especiales como / ^ $.?*|+()[{En mi expresión regular? (2)

Escapar con una barra invertida doble

R trata las barras invertidas como valores de escape para las constantes de caracteres . (... y también lo hacen las expresiones regulares. De ahí la necesidad de dos barras invertidas al proporcionar un argumento de carácter para un patrón. El primero no es en realidad un carácter, sino que convierte al segundo en un carácter.) Puede ver cómo se procesan con 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: €

Lectura adicional: escapar de una barra diagonal inversa con una barra diagonal inversa en R produce 2 barras diagonales inversas en una cadena, no 1

Para usar caracteres especiales en una expresión regular, el método más simple suele ser escapar de ellos con una barra diagonal inversa, pero como se señaló anteriormente, la barra diagonal inversa en sí misma debe escapar.

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

Para hacer coincidir las barras invertidas, debe doble escape, lo que resulta en cuatro barras invertidas.

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

El paquete rebus contiene constantes para cada uno de los caracteres especiales para ahorrarle barras diagonales.

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

Para más ejemplos ver:

?SpecialCharacters

Su problema se puede resolver de esta manera:

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

Formar una clase de personaje

También puede ajustar los caracteres especiales entre corchetes para formar una clase de caracteres .

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

Dos de los caracteres especiales tienen un significado especial dentro de las clases de caracteres: / y ^ .

La barra invertida aún debe escaparse incluso si está dentro de una clase de personaje.

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

Caret solo necesita escapar si es directamente después del corchete de apertura.

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

rebus también te permite formar una clase de personaje.

char_class("?") ## <regex> [?]

Usa una clase de personaje preexistente

Si desea hacer coincidir todos los signos de puntuación, puede usar la clase de carácter [:punct:] .

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

stringi asigna esto a la Categoría general Unicode para la puntuación, por lo que su comportamiento es ligeramente diferente.

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

También puede usar la sintaxis multiplataforma para acceder a un UGC.

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

Use escapes / Q / E

Al colocar caracteres entre //Q y //E el motor de expresiones regulares los trata literalmente en lugar de como expresiones regulares.

grepl("//Q.//E", "a.b") ## [1] TRUE

rebus te permite escribir bloques literales de expresiones regulares.

literal(".") ## <regex> /Q./E

No uses expresiones regulares

Las expresiones regulares no siempre son la respuesta. Si desea hacer coincidir una cadena fija, puede hacer, por ejemplo:

grepl("[", "a[b", fixed = TRUE) stringr::str_detect("a[b", fixed("[")) stringi::stri_detect_fixed("a[b", "[")

Quiero hacer coincidir un carácter especial de expresión regular , /^$.?*|+()[{ . Lo intenté:

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

(Equivalentemente stringr::str_detect(x, "[") o stringi::stri_detect_regex(x, "[") .)

Duplicar el valor para escapar no funciona:

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

Tampoco el uso de una barra invertida:

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

¿Cómo hago coincidir caracteres especiales?

Algunos casos especiales de esto en preguntas que son antiguas y están bien escritas para que sea descarado cerrar como duplicados de esto:
Períodos escapados en expresiones regulares R
¿Cómo escapar de un signo de interrogación en R?
tubería de escape ("|") en una expresión regular


Creo que la forma más fácil de unir los personajes como

/^$.?*|+()[

están utilizando clases de caracteres desde R. Considere lo siguiente para limpiar los encabezados de columna de un archivo de datos, que podría contener espacios y caracteres de puntuación:

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

Este enfoque nos permite encadenar las clases de caracteres para que coincidan con los caracteres de puntuación, además de los espacios en blanco, algo de lo que normalmente tendrías que escapar con // para detectar. Puede obtener más información sobre las clases de personajes en esta hoja de trucos a continuación, y también puede escribir ?regexp para ver más información sobre esto.

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