2009-09-21 17 views
178

Necesito extraer de una cadena un conjunto de caracteres que se incluyen entre dos delimitadores, sin devolver los delimitadores.Expresión regular para encontrar una cadena incluida entre dos caracteres, mientras que EXCLUYENDO los delimitadores

Un ejemplo sencillo debería ser útil:

Objetivo: extraer la subcadena entre corchetes, sin devolver los propios soportes.

cadena de Base: Esta es una cadena de prueba [más o menos]

Si utilizo el siguiente reg. ex.

\[.*?\]

El partido es [más o menos]. Necesito obtener solo más o menos (sin los soportes).

¿Es posible hacerlo?

+0

relacionados: [Regex de ajuste de todos los caracteres entre dos cadenas] (https://stackoverflow.com/q/6109882) – Dukeling

Respuesta

289

Fácil hecho:

(?<=\[)(.*?)(?=\]) 

Técnicamente que está usando los símbolos de anticipación y lookbehinds. Ver Lookahead and Lookbehind Zero-Width Assertions. El patrón consta de:

  • va precedido de un [que no se captura (mira detrás);
  • un grupo capturado no codicioso. No es codicioso detenerse en el primero]; y
  • seguido de a] que no se captura (anticipación).

Alternativamente, usted puede simplemente captar lo que hay entre los corchetes:

\[(.*?)\] 

y devolver el primer grupo capturado en lugar de todo el partido.

+79

"Fácil hecho", LOL! :) Las expresiones regulares siempre me dan dolor de cabeza, tiendo a olvidarlas tan pronto como encuentre las que resuelven mis problemas. Acerca de sus soluciones: la primera funciona como se espera, la segunda no, sigue incluyendo los corchetes. Estoy usando C#, tal vez el objeto RegEx tiene su propio "sabor" de motor regex ... – Diego

+2

Lo está haciendo porque estás viendo el partido completo en lugar del primer grupo coincidente. – cletus

+0

¡Muchas gracias, sitio web muy útil! Lo mantendré como referencia. :) Lo siento si he hecho algo de confusión, C# desarrollo no es realmente una de mis habilidades .. – Diego

17

Solo necesita 'capturar' el bit entre los paréntesis.

\[(.*?)\] 

Para capturarlo, póngalo entre paréntesis. Usted no dice qué idioma está usando. En Perl, por ejemplo, tendrías acceso a esto usando la variable de $ 1.

my $string ='This is the match [more or less]'; 
$string =~ /\[(.*?)\]/; 
print "match:$1\n"; 

Otros idiomas tendrán diferentes mecanismos. C#, por ejemplo, usa la clase Match collection, creo.

+0

Gracias, pero esta solución no funciona, se mantiene incluyendo los corchetes. Como escribí en mi comentario a la solución de Cletus, podría ser que el objeto C# RegEx lo interpreta de manera diferente. Sin embargo, no soy experto en C#, así que es solo una conjetura, tal vez sea solo mi falta de conocimiento. :) – Diego

+0

¡Lo siento, no quise rechazar esta respuesta! – im3r3k

7

PHP:

$string ='This is the match [more or less]'; 
preg_match('#\[(.*)\]#', $string, $match); 
var_dump($match[1]); 
2

Para eliminar también el uso []:

\[.+\] 
0

Si necesita extraer el texto sin los corchetes, puede utilizar fiesta awk

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

resultado:

hola mundo

2

Tuve el mismo problema al usar regex con bash scripting. utilicé una solución de 2 pasos usando tubos con grep -o aplicar

'\[(.*?)\]' 

primero, entonces

'\b.*\b' 

Obviamente no es tan eficiente en las otras respuestas, pero una alternativa.

19

Si está utilizando JavaScript, la first solution proporcionada por Cletus, (?<=\[)(.*?)(?=\]), no funcionará porque JavaScript no soporta el operador de búsqueda hacia atrás.

Sin embargo, la segunda solución funciona bien, pero debe obtener el segundo elemento coincidente.

Ejemplo:

var regex = /\[(.*?)\]/; 
var strToMatch = "This is a test string [more or less]"; 
var matched = regex.exec(strToMatch); 

volverá:

["[more or less]", "more or less"] 

lo tanto, lo que necesita es el segundo valor. Uso:

var matched = regex.exec(strToMatch)[1]; 

Para volver:

"more or less" 
+2

Clásico truco amigo –

2

Esta funciona específicamente para analizador de expresiones regulares de JavaScript /[^[\]]+(?=])/g

basta con ejecutar esto en la consola

var regex = /[^[\]]+(?=])/g; 
var str = "This is a test string [more or less]"; 
var match = regex.exec(str); 
match; 
1

[^\[] cualquier carácter eso no es [.

+ Coincide con 1 o más elementos de cualquier cosa que no sea [. Crea grupos de estas coincidencias.

(?=\]) Mirada anticipada ]. Coincide con un grupo que termina en ] sin incluirlo en el resultado.

Listo.

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

Proof.

http://regexr.com/3gobr

Similar a la solución propuesta por nulo. Pero el adicional \] no es requerido. Como nota adicional, parece que \ no es necesario para escapar del [ después del ^. Para facilitar la lectura, me gustaría dejarlo en.

no funciona en la situación en la que los delimitadores son idénticos. "more or less" por ejemplo.

Cuestiones relacionadas