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.

ObiWanKenobi
fuente

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.
codictorio
fuente
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:

(\[(?:\[??[^\[]*?\]))
Adam Moszczyński
fuente
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:

\[([^]]+)\]
jasonbar
fuente
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.

Tim Pietzcker
fuente
@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.

LJ Germain
fuente
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'"
devd
fuente
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

Emma
fuente
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

(\[.*\])
ßãlãjî
fuente
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 +.

fantasmas
fuente
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
Nezar Fadle
fuente
3

En R, intente:

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"
Tony Ladson
fuente
..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:

Wiktor Stribiżew
fuente
0

Necesitaba incluir nuevas líneas e incluir los corchetes

\[[\s\S]+\]

hombre de la ciudad
fuente