Expresión regular para extraer texto entre corchetes


412

Pregunta simple de expresiones regulares. Tengo una cadena en el siguiente formato:

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

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

sample
some
another one

Nota: en mi caso de uso, los corchetes no se pueden anidar.

Respuestas:


767

Puede usar la siguiente expresión regular globalmente :

\[(.*?)\]

Explicación:

  • \[: [es un meta char y necesita ser escapado si quiere hacer coincidirlo literalmente.
  • (.*?) : combina todo de una manera no codiciosa y captúralo.
  • \]: ]es un meta char y necesita ser escapado si quiere hacer coincidirlo literalmente.

99
El método de la otra respuesta, usar [^]]es más rápido que no codicioso ( ?), y también funciona con sabores de expresiones regulares que no admiten no codiciosos. Sin embargo, no codicioso se ve mejor.
Ipsquiggle

184
¿Cómo excluir [ ]de la salida (resultado)?
Mickey Tin

99
@MickeyTin, si está utilizando Java, puede agruparlo usando group (1) sobre solo group (), por lo que '[]' no irá junto
abyteneverlie

21
Esto coincide solo con la primera aparición
hfatahi

99
¿Cómo excluye los corchetes de la devolución?
jzadra

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

Capturará contenido sin corchetes

  • (?<=\[) - mirada positiva hacia atrás para [

  • .*? - coincidencia no codiciosa para el contenido

  • (?=\]) - anticipación positiva para ]

EDITAR: para corchetes anidados, la expresión regular a continuación debería funcionar:

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

3
@igaurav Lo he comprobado y funciona. Sin embargo, no funcionará en entornos que no admitan lookbehinds como Javascript. Tal vez ese es el caso tuyo?
Adam Moszczyński

Adam, tu solución de paréntesis anidados falla cuando hay una cadena con un ....
patrick

89

Esto debería funcionar bien:

\[([^]]+)\]

55
En mi caso de uso, el texto entre corchetes puede incluir nuevas líneas, y esta expresión regular funciona, mientras que la respuesta aceptada no.
Dave

1
¿Qué significa la clase de caracteres [^]]? ¿Con qué coincide?
Richard

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

8
Creo que no funciona como se esperaba, debe usarlo \[([^\[\]]*)\]para obtener el contenido en el soporte más interno. Si miras dentro lfjlksd [ded[ee]22], \[([^]]+)\]te obtendrá [ded[ee]mientras la expresión propuesta volvería [ee]. testede in link
TMC

1
¿Puede proporcionar ejemplos 'sed' y 'awk' para usar esta expresión regular y extraer texto? Gracias.
valentt

32

¿Se pueden anidar paréntesis?

Si no: \[([^]]+)\]coincide con un elemento, incluidos los corchetes. La referencia inversa \1contendrá el elemento que se corresponderá. Si su sabor regex es compatible con la búsqueda, use

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

Esto solo coincidirá con el elemento entre paréntesis.


@KunalMukherjee: No, la expresión regular puede coincidir cualquier cantidad de veces. Pero algunos sabores de expresiones regulares necesitan que se les diga explícitamente que apliquen la expresión regular repetidamente (por ejemplo, usando la /gbandera en JavaScript).
Tim Pietzcker

14

Si no desea incluir los corchetes en el partido, aquí está la expresión regular: (?<=\[).*?(?=\])

Vamos a descomponerlo

La .coincide con cualquier carácter excepto para las terminaciones de línea. El ?=es un lookahead positivo . Una búsqueda anticipada positiva encuentra una cadena cuando una determinada cadena viene después de ella. El ?<=es una mirada positiva hacia atrás . Una mirada hacia atrás positiva encuentra una cadena cuando cierta cadena la precede. Para citar esto ,

Mira hacia adelante positivo (? =)

Encuentre la expresión A donde sigue la expresión B:

A(?=B)

Mire hacia atrás positivo (? <=)

Encuentre la expresión A donde la expresión B precede:

(?<=B)A

La alternativa

Si su motor regex no es compatible con lookaheads y lookbehinds, puede usar la expresión regular \[(.*?)\]para capturar las entrañas de los corchetes en un grupo y luego puede manipular el grupo según sea necesario.

¿Cómo funciona esta expresión regular?

Los paréntesis capturan los personajes en un grupo. La .*?obtiene todos los caracteres entre los corchetes (excepto para las terminaciones de línea, a menos que tenga el sindicador de habilitación) de una manera que no es codicioso.


12

(?<=\[).*?(?=\])funciona bien según la explicación dada anteriormente. Aquí hay 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 expresiones regulares, donde sea que aparezcan. Si la expresión regular se encuentra en el texto en lugar de en un bloque de código, puede usar las teclas de retroceso para formatearlas. ( ref )
Alan Moore

1
Además, la pregunta era sobre corchetes ( []), no entre paréntesis.
Alan Moore

6

Por si acaso, es posible que haya tenido corchetes desequilibrados , es probable que pueda diseñar alguna expresión con recursión similar a,

\[(([^\]\[]+)|(?R))*+\]

que, por supuesto, se relacionaría con el idioma o el motor RegEx que podría estar utilizando.

Demo de RegEx 1


Aparte de eso,

\[([^\]\[\r\n]*)\]

RegEx Demo 2

o,

(?<=\[)[^\]\[\r\n]*(?=\])

RegEx Demo 3

Son buenas opciones para explorar.


Si desea simplificar / modificar / explorar la expresión, se explica en el panel superior derecho de regex101.com . Si lo desea, también puede ver en este enlace cómo coincidiría con algunas entradas de muestra.


Circuito RegEx

jex.im visualiza expresiones regulares:

ingrese la descripción de la imagen aquí

Prueba

const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Fuente

Expresión regular para que coincida con paréntesis equilibrados


4

si desea relleno solo una pequeña letra del alfabeto entre corchetes az

(\[[a-z]*\])

si quieres letras pequeñas y mayúsculas a-zA-Z

(\[[a-zA-Z]*\]) 

si quiere letras mayúsculas y minúsculas a-zA-Z0-9

(\[[a-zA-Z0-9]*\]) 

si quieres todo entre corchetes

si quieres texto, número y símbolos

(\[.*\])

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

Lo anterior debería funcionar dada la siguiente explicación

  • los caracteres entre corchetes [] definen la clase de caracteres, lo que significa que el patrón debe coincidir al menos con un carácter mencionado entre corchetes

  • \ s especifica un espacio

  •  + significa al menos uno de los caracteres mencionados anteriormente a +.


En casos sensibles se A-Zdebe agregar al patrón ([[][a-zA-Z \s]+[]]):; Creo que es una buena manera, mientras que \ en los patrones de expresiones regulares que se definen en las marcas de cadena ("y ') y se mezclan los novatos mediante el manejo de barra invertida en" o' usos!
MohaMad

la única respuesta que me funcionó para C ++ regex (excepto que lo estoy haciendo con comillas en lugar de corchetes). std::regex pattern{R"(["][a-zA-Z \s]+["])"};
StackAttack

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

3

En R, intente:

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"

..o gsub(pat, "\\1", x, perl=TRUE), ¿dónde patestá la expresión regular que proporcionó ..
Karsten W.

1

Para hacer coincidir una subcadena entre el primero [ y el último ] , puede usar

\[.*\]            # Including open/close brackets
\[(.*)\]          # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\])   # Excluding open/close brackets (using lookarounds)

Vea una demostración de expresiones regulares y una demostración de expresiones regulares # 2 .

Use las siguientes expresiones para unir cadenas entre los corchetes más cercanos :

  • Incluyendo los soportes:

    • \[[^][]*]- PCRE, Python re/ regex, .NET, Golang, POSIX (grep, sed, bash)
    • \[[^\][]*]- ECMAScript (JavaScript, C ++ std::regex, VBA RegExp)
    • \[[^\]\[]*] - Java regex
    • \[[^\]\[]*\] - Onigmo (Ruby, requiere escapar de los corchetes en todas partes)
  • Excluyendo los corchetes:

    • (?<=\[)[^][]*(?=])- PCRE, Python re/ regex, .NET (C #, etc.), ICU (R stringr), software JGSoft
    • \[([^][]*)]- Bash , Golang : capture el contenido entre corchetes con un par de paréntesis sin escape, también vea a continuación
    • \[([^\][]*)]- JavaScript , C ++std::regex , VBARegExp
    • (?<=\[)[^\]\[]*(?=]) - Java regex
    • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, requiere escapar de los corchetes en todas partes)

NOTA : *coincide con 0 o más caracteres, use +para coincidir con 1 o más para evitar coincidencias de cadenas vacías en la lista / matriz resultante.

Siempre que esté disponible el soporte de lookaround, las soluciones anteriores se basan en ellos para excluir el soporte de apertura / cierre inicial / final. De lo contrario, confíe en capturar grupos (se han proporcionado enlaces a las soluciones más comunes en algunos idiomas).

Si necesita hacer coincidir paréntesis anidados , puede ver las soluciones en la expresión regular para hacer coincidir el hilo de paréntesis equilibrados y reemplazar los corchetes con los cuadrados para obtener la funcionalidad necesaria. Debe usar grupos de captura para acceder a los contenidos con el soporte de apertura / cierre excluido:


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.