¿Cómo que impares? En los primeros ejemplos hay algunos que tienen un número impar de caracteres...
Falta algo más de precisión...
Si, por ejemplo, queremos que el número de ceros que siguen al uno sea par, entonces podemos tener una expresión regular como la siguiente:
Código Perl:
Ver original#!/usr/bin/perl
use 5.010;
100
10000
010000
01000000
0100000000
010000000000
);
10
010
01000
0100000
010000000
01000000000
);
my $regexp = qr/^0?1(0*)\1$/;
for (@test_ok) {
unless (/$regexp/) {
say "Falló $regexp con prueba positiva de $_";
}
}
for (@test_nook) {
if (/$regexp/) {
say "Falló $regexp con prueba negativa de $_";
}
}
El programa no debe generar nada, indicando que la expresión regular ha cazado todas las combinaciones que nos interesan, y descartado las demás.
La expresión regular (
^0?1(0*)\1$) funciona así: desde el principio (
^) al final (
$), buscamos un texto que comience quizás con 0 (
0?), seguido de un '1', seguido de una cantidad de ceros, que capturamos (
(0*)), y seguida por la misma cantidad de ceros capturados antes (
\1). De esa manera, nos aseguramos que el número de ceros siempre sea par.