regex - solo - Expresión regular para encontrar una cadena incluida entre dos caracteres mientras EXCLUYE los delimitadores
javascript regex test (10)
Este funciona específicamente para el analizador de expresiones regulares de javascript /[^[/]]+(?=])/g
solo ejecuta esto en la consola
var regex = /[^[/]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;
Necesito extraer de una cadena un conjunto de caracteres que se incluyen entre dos delimitadores, sin devolver los delimitadores.
Un ejemplo simple debería ser útil:
Objetivo : extraer la subcadena entre corchetes, sin devolver los corchetes.
Cadena base : This is a test string [more or less]
Si utilizo el siguiente registro. ex.
/[.*?/]
El partido es [more or less]
. Necesito obtener solo more or less
(sin los paréntesis).
¿Es posible hacer lo?
Fácil hecho
(?<=/[)(.*?)(?=/])
Técnicamente eso es usar lookaheads y look behinds. Ver Lookahead y Lookbehind Cero-Ancho aserciones . El patrón consiste en:
- está precedido por un [que no se captura (mira por detrás);
- Un grupo capturado no codicioso. No es codicioso detenerse en el primero]; y
- es seguido por un] que no es capturado (lookahead).
Alternativamente, puedes simplemente capturar lo que hay entre los corchetes:
/[(.*?)/]
y devuelve el primer grupo capturado en lugar de la partida completa.
PHP:
$string =''This is the match [more or less]'';
preg_match(''#/[(.*)/]#'', $string, $match);
var_dump($match[1]);
Para eliminar también el uso de []:
/[.+/]
Quería encontrar una cadena entre / y #, pero # a veces es opcional. Aquí está la expresión regular que uso:
(?<=//)([^#]+)(?=#*)
Si está utilizando JavaScript , la primera solución proporcionada por cletus, (?<=/[)(.*?)(?=/])
, No funcionará porque JavaScript no es compatible con el operador lookbehind.
Sin embargo, la segunda solución funciona bien, pero necesita 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"]
Entonces, lo que necesitas es el segundo valor. Utilizar:
var matched = regex.exec(strToMatch)[1];
Regresar:
"more or less"
Si necesita extraer el texto sin los corchetes, puede usar bash awk
echo " [hola mundo] " | awk -F''[][]'' ''{print $2}''
resultado:
hola mundo
Solo necesitas ''capturar'' el bit entre paréntesis.
/[(.*?)/]
Para capturarlo lo pones entre paréntesis. Usted no dice qué idioma está usando esto. En Perl, por ejemplo, accederías a esto usando la variable $ 1.
my $string =''This is the match [more or less]'';
$string =~ //[(.*?)/]/;
print "match:$1/n";
Otras lenguas tendrán diferentes mecanismos. C #, por ejemplo, usa la clase de colección Match , creo.
Tuve el mismo problema al usar expresiones regulares con scripts de bash. Usé una solución de 2 pasos usando tuberías con grep -o aplicando
''/[(.*?)/]''
primero luego
''/b.*/b''
Obviamente no es tan eficiente en las otras respuestas, sino una alternativa.
[^/[]
Empareja cualquier carácter que no sea [.
+
Combina 1 o más de lo que no sea [
. Crea grupos de estos partidos.
(?=/])
Lookahead positivo ]
. Coincide con un grupo que termina con ]
sin incluirlo en el resultado.
Hecho.
[^/[]+(?=/])
Prueba.
Similar a la solución propuesta por null. Pero el adicional /]
no es necesario. Como nota adicional, aparece /
no es necesario escapar de [
después de ^
. Por legibilidad, lo dejaría en.
No funciona en la situación en la que los delimitadores son idénticos. "more or less"
por ejemplo.