one - ¿Cómo puedo encontrar letras repetidas con Perl Regex?
regex groups javascript (11)
Creo que esto también debería funcionar:
((/w)(?=/2))+/2
Estoy buscando una expresión regular que encontrará letras que se repiten. Entonces, cualquier carta dos o más veces, por ejemplo:
booooooot or abbott
No sabré la carta que estoy buscando con anticipación.
Esta es una pregunta que me hicieron en entrevistas y luego me preguntaron en entrevistas. No mucha gente lo entiende correctamente.
Creo que realmente quiere esto en lugar de la "/ w" ya que eso incluye números y guiones bajos.
([a-zA-Z])/1+
Ok, vale, puedo darme una pista Leon. Úselo para el mundo Unicode o para cosas de posix.
([[:alpha:]])/1+
Creo que usar una referencia inversa funcionaría:
(/w)/1+
/w
es básicamente [a-zA-Z_0-9]
así que si solo quieres hacer coincidir las letras entre A y Z (sin distinción de mayúsculas y minúsculas), utiliza [a-zA-Z]
lugar.
(EDITAR: o, como Tanktalus mencionado en su comentario (y como otros han respondido también), [[:alpha:]]
, que es sensible a la configuración regional)
El código siguiente devolverá todos los caracteres, que se repiten dos veces o más.
my $ str = "SSSannnkaaarsss";
imprimir $ str = ~ / (/ w) / 1 + / g;
Es posible que desee tener cuidado con lo que se considera una carta, y esto depende de su ubicación. El uso de ISO Latin-1 permitirá que los caracteres acentuados del idioma occidental se combinen como letras. En el siguiente programa, la configuración regional predeterminada no reconoce é, y por lo tanto no coincide con créé . Descomente el código de configuración de configuración regional y luego comienza a coincidir.
También tenga en cuenta que / w incluye dígitos y el carácter de subrayado junto con todas las letras. Para obtener solo las letras, debe tomar el complemento de los caracteres no alfanuméricos, dígitos y guiones bajos. Esto deja solo letras.
Eso podría ser más fácil de entender al enmarcarlo como la pregunta "¿Qué expresión regular concuerda con cualquier dígito excepto 3?", Y la respuesta es / [^ / D3] /.
#! /usr/local/bin/perl
use strict;
use warnings;
# uncomment the following three lines:
# use locale;
# use POSIX;
# setlocale(LC_CTYPE, ''fr_FR.ISO8859-1'');
while (<DATA>) {
chomp;
if (/([^/W_0-9])/1+/) {
print "$_: dup [$1]/n";
}
else {
print "$_: nope/n";
}
}
__DATA__
100
food
créé
a::b
FYI, aparte de RegExBuddy, un sitio realmente útil y gratuito para probar expresiones regulares es RegExr en gskinner.com . Maneja ([[:alpha:]])(/1+)
muy bien.
Puede encontrar cualquier letra, luego use /1
para encontrar la misma letra por segunda vez (o más). Si solo necesita saber la letra, entonces $1
contendrá. De lo contrario, puede concatenar la segunda coincidencia con la primera.
my $str = "Foooooobar";
$str =~ /(/w)(/1+)/;
print $1;
# prints ''o''
print $1 . $2;
# prints ''oooooo''
Qué tal si:
(/w)/1+
La primera parte crea un grupo sin nombre alrededor de un personaje, luego la referencia retrospectiva busca ese mismo personaje.
Solo por patadas, un enfoque completamente diferente:
if ( ($str ^ substr($str,1) ) =~ //0+/ ) {
print "found ", substr($str, $-[0], $+[0]-$-[0]+1), " at offset ", $-[0];
}
Use / N para referirse a grupos anteriores:
/(/w)/1+/g
/(.)//1{2,}+/u
''u'' modificador que coincide con unicode