2012-09-05 35 views
8

¿Qué significan los corchetes dobles en una expresión regular? Estoy confundido acerca de los siguientes ejemplos:¿Cómo usar los corchetes dobles en una expresión regular?

/[[^abc]]/ 

/[^abc]/ 

que estaba probando el uso de Rubular, pero yo no veo ninguna diferencia entre el uno con soportes dobles y soportes individuales.

+0

he creado [ampliar-corchetes] (https://www.npmjs.com/package/ ampliar-corchetes), si le interesa ver una implementación de javascript que coincida con las clases de caracteres de posix – jonschlinkert

Respuesta

8

Posix character classes uso de una notación [:alpha:], que se utilizan dentro de una expresión regular como:

/[[:alpha:][:digit:]]/ 

Tendrá que desplazarse hacia abajo lejos para llegar a la información Posix en el enlace anterior. De los documentos:

Las expresiones de corchetes POSIX también son similares a las clases de caracteres. Proporcionan una alternativa portátil a las anteriores, con la ventaja adicional de que abarcan caracteres que no son ASCII. Por ejemplo,/\ d/coincide solo con los dígitos decimales ASCII (0-9); mientras que/[[: digit:]]/coincide con cualquier carácter en la categoría Unicode Nd.

/[[:alnum:]]/ - Alphabetic and numeric character 
/[[:alpha:]]/ - Alphabetic character 
/[[:blank:]]/ - Space or tab 
/[[:cntrl:]]/ - Control character 
/[[:digit:]]/ - Digit 
/[[:graph:]]/ - Non-blank character (excludes spaces, control characters, and similar) 
/[[:lower:]]/ - Lowercase alphabetical character 
/[[:print:]]/ - Like [:graph:], but includes the space character 
/[[:punct:]]/ - Punctuation character 
/[[:space:]]/ - Whitespace character ([:blank:], newline, 
carriage return, etc.) 
/[[:upper:]]/ - Uppercase alphabetical 
/[[:xdigit:]]/ - Digit allowed in a hexadecimal number (i.e., 0-9a-fA-F) 

Rubí también es compatible con las siguientes clases que no son de carácter POSIX:

/[[:word:]]/ - A character in one of the following Unicode general categories Letter, Mark, Number, Connector_Punctuation 
/[[:ascii:]]/ - A character in the ASCII character set 
# U+06F2 is "EXTENDED ARABIC-INDIC DIGIT TWO" 

/[[:digit:]]/.match("\u06F2") #=> #<MatchData "\u{06F2}"> 
/[[:upper:]][[:lower:]]/.match("Hello") #=> #<MatchData "He"> 
/[[:xdigit:]][[:xdigit:]]/.match("A6") #=> #<MatchData "A6"> 
+0

Esta respuesta se ha agregado a [Preguntas frecuentes sobre la expresión regular de desbordamiento de pila] (http://stackoverflow.com/a/22944075/2736496), en "Clases de caracteres". – aliteralmind

4

'[[' no tiene ningún significado especial. [xyz] es una clase de caracteres y coincidirá con un solo x, y o z. El quilate ^ toma todos los caracteres que no están entre corchetes.

Eliminando ^ por simplicidad, puede ver que el primer soporte abierto se está combinando con el primer corchete de cierre y el segundo corchete cerrado se está utilizando como parte de la clase de caracteres. El corchete de cierre final se trata como otro personaje que se emparejará.

irb(main):032:0> /[[abc]]/ =~ "[a]" 
=> 1 
irb(main):033:0> /[[abc]]/ =~ "a]" 
=> 0 

Esto parece tener el mismo resultado que el original en algunos casos

irb(main):034:0> /[abc]/ =~ "a]" 
=> 0 
irb(main):034:0> /[abc]/ =~ "a" 
=> 0 

Pero esto es sólo porque su expresión regular no está buscando una coincidencia exacta.

irb(main):036:0> /^[abc]$/ =~ "a]" 
=> nil 
+1

Tenga en cuenta que esto no es cierto para todos los sabores de expresiones regulares. Por ejemplo, Java lo trataría como una clase de caracteres que no contiene nada más que otra clase de caracteres, por lo que '[[^ abc]]' y '[^ abc]' son efectivamente idénticos. –

+0

FWIW - Python tiene un comportamiento equivalente al de la respuesta anterior, no está seguro acerca de otros lenguajes, o lo que 'debería' estar haciendo, aunque preferiría el comportamiento que menciona @AlanMoore. – dfb

Cuestiones relacionadas