Comment puis-je trouver des lettres répétées avec une regex Perl?
Je suis à la recherche d'une expression rationnelle qui trouvera des lettres répétitives. Donc, toute lettre deux fois ou plus, par exemple:
booooooot or abbott
Je ne connaîtrai pas la lettre que je cherche à l'avance.
C'est une question qui m'a été posée dans les interviews et ensuite posée dans les interviews. Pas si beaucoup de gens le font correctement.
11 réponses
, Vous pouvez trouver n'importe quelle lettre, puis utilisez \1
trouver la même lettre une seconde fois (ou plus). Si vous avez seulement besoin de connaître la lettre, alors $1
La contiendra. Sinon, vous pouvez concaténer la deuxième correspondance sur la première.
my $str = "Foooooobar";
$str =~ /(\w)(\1+)/;
print $1;
# prints 'o'
print $1 . $2;
# prints 'oooooo'
Je pense que vous voulez réellement ceci plutôt que le "\ w " car cela inclut les nombres et le trait de soulignement.
([a-zA-Z])\1+
Ok, ok, je peux prendre un indice Leon. Utilisez ceci pour le monde unicode ou pour les choses posix.
([[:alpha:]])\1+
Je pense que l'utilisation d'une référence arrière fonctionnerait:
(\w)\1+
\w
est fondamentalement [a-zA-Z_0-9]
donc si vous voulez seulement faire correspondre les lettres entre A et Z (sans tenir compte de la casse), utilisez [a-zA-Z]
à la place.
(EDIT: ou, comme Tanktalus mentionné dans son commentaire (et comme d'autres l'ont répondu ainsi), [[:alpha:]]
, qui est sensibles aux paramètres régionaux)
Utilisez \n pour faire référence aux groupes précédents:
/(\w)\1+/g
Vous voudrez peut-être faire attention à ce qui est considéré comme une lettre, et cela dépend de vos paramètres régionaux. L'utilisation de L'ISO Latin-1 permettra de mettre en correspondance les caractères accentués de la langue occidentale sous forme de lettres. Dans le programme suivant, les paramètres régionaux par défaut ne reconnaissent pas é, et donc créé ne correspond pas. Décommentez le code de réglage des paramètres régionaux, puis il commence à correspondre.
Notez également que \w inclut des chiffres et le caractère de soulignement ainsi que toutes les lettres. Pour obtenir juste les lettres, vous devez prendre le complément des caractères non alphanum, des chiffres et des caractères de soulignement. Cela ne laisse que des lettres.
Cela pourrait être plus facile à comprendre en l'encadrant comme la question " Quelle expression régulière correspond à n'importe quel chiffre sauf 3?"et la réponse est /[^\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
Juste pour les coups de pied, une approche complètement différente:
if ( ($str ^ substr($str,1) ) =~ /\0+/ ) {
print "found ", substr($str, $-[0], $+[0]-$-[0]+1), " at offset ", $-[0];
}
FYI, mis à part RegExBuddy, un vrai site gratuit pratique pour tester les expressions régulières est RegExr à gskinner.com . gère ([[:alpha:]])(\1+)
bien.
Que diriez-vous de:
(\w)\1+
La première partie crée un groupe sans nom autour d'un caractère, puis la référence arrière recherche ce même caractère.