Pergunta

Eu estou procurando um regex que vai encontrar letras de repetição. Assim, qualquer letra duas vezes ou mais, por exemplo:

booooooot or abbott

Eu não sei a letra Eu estou procurando antes do tempo.

Esta é uma pergunta que me foi perguntado em entrevistas e, em seguida, perguntou em entrevistas. Não tantas pessoas conseguiu correto.

Foi útil?

Solução

Você pode encontrar qualquer letra, então use \1 para encontrar essa mesma letra de uma segunda vez (ou mais). Se você só precisa saber a letra, então $1 irá contê-lo. Caso contrário, você pode concatenar o segundo jogo para o primeiro.

my $str = "Foooooobar";

$str =~ /(\w)(\1+)/;

print $1;
# prints 'o'
print $1 . $2;
# prints 'oooooo'

Outras dicas

Eu acho que você realmente quer este em vez de "\ w" como que inclui os números e sublinhado.

([a-zA-Z])\1+

Ok, ok, eu posso dar uma dica Leon. Use este para unicode-mundo ou para o material POSIX.

([[:alpha:]])\1+

Eu acho que usando um backreference iria funcionar:

(\w)\1+

\w é basicamente [a-zA-Z_0-9] por isso, se você só quer combinar cartas entre A e Z (caso insensível), o uso [a-zA-Z] vez.

(EDIT: ou, como Tanktalus mencionou em seu comentário (e como outros têm respondido bem), [[:alpha:]] , que é local de minúsculas)

Use \ N para se referir a grupos anteriores:

/(\w)\1+/g

Você pode querer tomar cuidado quanto ao que é considerado como uma carta, e isso depende de sua localidade. Usando ISO Latin-1 permitirá caracteres do idioma ocidental acentuados de ser compensada como letras. No programa seguinte, a localidade padrão não reconhece E, e, portanto, créé não corresponde. Uncomment o código de configuração local, e em seguida, ele começa a combinar.

Observe também que \ w inclui dígitos e o caractere sublinhado junto com todas as letras. Para obter apenas as letras, você precisa tomar o complemento do não-alphanum, dígitos e caracteres de sublinhado. Isso deixa apenas letras.

Isso pode ser mais fácil de entender por enquadrá-la como a pergunta "Qual expressão regular corresponde a qualquer dígito, exceto 3?", Ea resposta é / [^ \ 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

O código a seguir irá retornar todos os personagens, que nunca se repetem duas vezes ou mais.

my $ str = "SSSannnkaaarsss";

imprimir $ str = ~ / (\ w) \ 1 + / g;

Apenas por diversão, uma abordagem completamente diferente:

if ( ($str ^ substr($str,1) ) =~ /\0+/ ) {
    print "found ", substr($str, $-[0], $+[0]-$-[0]+1), " at offset ", $-[0];
}

FYI, além de RegexBuddy, um verdadeiro calhar local livre para testar expressões regulares é RegExr em gskinner.com . Alças ([[:alpha:]])(\1+) bem.

Como sobre: ??

(\w)\1+

A primeira parte faz um grupo não identificado em torno de um personagem, então a aparência back-referência para o mesmo personagem.

Eu acho que isso também deve funcionar:

((\w)(?=\2))+\2

/(.)\\1{2,}+/u

'u' modificador de correspondência com unicode

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top