regular - regex text between tags
¿Cómo puedo dividir una cadena en trozos de dos caracteres cada uno en Perl? (4)
El patrón pasado a split
identifica qué separa lo que desea. Si quisieras usar split, usarías algo como
my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string;
o
my @pairs = split /(?=(?:.{2})+/z)/s, $string;
Esas son soluciones bastante pobres. Mejores soluciones incluyen:
my @pairs = $string =~ /..?/sg; # Accepts odd-length strings.
my @pairs = $string =~ /../sg;
my @pairs = unpack ''(a2)*'', $string;
¿Cómo tomo una cadena en Perl y la divido en una matriz con entradas de dos caracteres cada una?
Intenté esto:
@array = split(/../, $string);
pero no obtuvo los resultados esperados.
En última instancia, quiero convertir algo como esto
F53CBBA476
en una matriz que contiene
F5 3C BB A4 76
En realidad, para atrapar el personaje impar, quieres hacer que el segundo personaje sea opcional:
@array = ( $string =~ m/..?/g );
Si realmente debe usar split
, puede hacer una:
grep {length > 0} split(/(..)/, $string);
Pero creo que la manera más rápida sería unpack
:
unpack("(A2)*", $string);
Ambos métodos tienen la "ventaja" de que si la cadena tiene un número impar de caracteres, generará la última por su cuenta.
@array = ( $string =~ m/../g );
El operador de coincidencia de patrones se comporta de una manera especial en un contexto de lista en Perl. Procesa la operación de forma iterativa, haciendo coincidir el patrón con el resto del texto después de la coincidencia anterior. Luego, la lista se forma a partir de todo el texto que coincidió durante cada aplicación de la coincidencia de patrones.