2010-03-08 28 views
233

Pregunta simple de expresiones regulares. Tengo una cadena en el siguiente formato:Expresión regular para extraer texto entre corchetes

this is a [sample] string with [some] special words. [another one] 

¿Cuál es la expresión regular para extraer las palabras dentro de los corchetes, es decir.

sample 
some 
another one 

Nota: En mi caso de uso, los soportes no se pueden anidar.

Respuesta

472

Usted puede usar la siguiente expresión regular a nivel mundial :

\[(.*?)\] 

Explicación:

  • \[: [ es un char meta y necesita ser escapado si desea hacer coincidir literalmente.
  • (.*?): empareja todo de una manera no codiciosa y captúralo.
  • \]: ] es un meta char y debe escaparse si quiere que coincida literalmente.
+6

El método de la otra respuesta, usando '[^]]' es más rápido que no codicioso ('?'), Y también funciona con sabores de expresiones regulares que no son compatibles con los no codiciosos. Sin embargo, no codicioso se ve mejor. – Ipsquiggle

+0

@Ipsquiggle está en lo correcto señor :) – StErMi

+92

Cómo excluir '[' ']' del resultado (resultado)? –

65

Esto debería funcionar bien:

\[([^]]+)\] 
+3

En mi caso de uso, el texto entre corchetes pueden incluir nuevas líneas, y esto funciona de expresiones regulares, mientras que la respuesta aceptada no lo hace. – Dave

+1

¿Qué significa la clase de personaje [^]]? ¿Qué coincide? – Richard

+2

@Richard, The^anula la clase de personaje. Significa "cualquier personaje que no sea un"]. – jasonbar

28

pueden anidarse entre paréntesis?

Si no: \[([^]]+)\] coincide con un elemento, incluidos los corchetes. Backreference \1 contendrá el elemento que se emparejará. Si su sabor es compatible con expresiones regulares lookaround, utilice

(?<=\[)[^]]+(?=\]) 

Esto sólo igualará el artículo dentro de los paréntesis.

+0

Esto solo marca la primera ocurrencia –

+0

@KunalMukherjee: No, la expresión regular puede coincidir cualquier cantidad de veces. Pero algunos sabores de expresiones regulares deben especificarse explícitamente para aplicar la expresión regular repetidamente (por ejemplo, usando el indicador '/ g' en JavaScript). –

1
([[][a-z \s]+[]]) 

anterior debería funcionar dado la siguiente explicación

  • caracteres entre corchetes [] define la clase characte lo que significa que el patrón debe coincidir con al menos uno charcater mencionado entre corchetes

  • \ s especifica un espacio

  • + significa al menos uno del personaje mencionado anteriormente a +.

+0

En casos delicados, 'A-Z' debería agregarse al patrón: '([[] [a-zA-Z \ s] + []])'; Creo que es una buena manera, mientras que '\' en patrones regex que define en las cadenas de caracteres ("y ') y mezclando a los novatos mediante el manejo de barras invertidas en" o' usos! – MohaMad

36
(?<=\[).+?(?=\]) 

capturará contenido sin soportes

(< = [?) - búsqueda hacia atrás positivo para [

*.? - coincidencia no codiciosa para el contenido

(?=]) - búsqueda positiva hacia delante para [

EDIT: para los soportes anidados la expresión regular a continuación debería funcionar:

(\[(?:\[??[^\[]*?\])) 
+2

@igaurav Lo he comprobado y funciona. Sin embargo, no funcionará en entornos que no admiten búsquedas como Javascript. Tal vez ese es tu caso? –

+0

Adam, su solución de paréntesis anidados falla cuando hay una cadena con un '.' en ella ... – patrick

3

Este código extraerá el contenido entre corchetes y paréntesis

(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\])) 

(?: non capturing group 
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses 
| or 
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets 
6

(?<=\().*?(?=\)) obras bien según la explicación dada arriba. Aquí está un ejemplo de Python:

import re 
str = "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')" 
re.search('(?<=\().*?(?=\))', str).group() 
"'formPagination_bottom',2,'Page',true,'1',null,'2013'" 
+1

Siempre debe usar el formato de código para las expresiones regulares, donde sea que aparezcan. Si la expresión regular está en el texto en lugar de en un bloque de código, puede usar los trazos para formatearlos. ([ref] (http://stackoverflow.com/editing-help#comment-formatting)) –

+0

Además, la pregunta era sobre corchetes ('[]'), no entre paréntesis. –

Cuestiones relacionadas