Frage

Ich bin auf der Suche nach einem regulären Ausdruck, die sich wiederholenden Buchstaben finden. So dass jeder Brief zweimal oder mehr, zum Beispiel:

booooooot or abbott

Ich werde den Brief nicht, dass ich für vor der Zeit suchen.

Dies ist eine Frage, die ich in Interviews gefragt und dann in Interviews gefragt. Nicht so viele Menschen bekommen es richtig.

War es hilfreich?

Lösung

Sie können jeden Buchstaben finden, dann \1 verwenden ein zweites Mal am selben Brief zu finden (oder mehr). Wenn Sie nur den Brief wissen müssen, dann wird $1 es enthalten. Andernfalls können Sie das zweite Spiel auf den ersten verketten.

my $str = "Foooooobar";

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

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

Andere Tipps

Ich glaube, Sie eigentlich diese wollen, anstatt die „\ w“ wie das schließt Zahlen und den Unterstrich.

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

Ok, ok, ich kann einen Hinweis Leon nehmen. Verwenden Sie diese Option für die Unicode-Welt oder für Posix-Sachen.

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

Ich denke, eine Rückreferenzierung mit funktionieren würde:

(\w)\1+

\w ist im Grunde [a-zA-Z_0-9] wenn Sie also nur Buchstaben übereinstimmen sollen zwischen A und Z (Fall unsensibel), Verwendung [a-zA-Z] statt.

(EDIT: oder, wie Tanktalus in seinem Kommentar erwähnt (und andere haben auch), [[:alpha:]] beantwortet, die locale-sensitive ist)

Verwenden Sie \ N zur vorherigen Gruppen verweisen:

/(\w)\1+/g

Vielleicht möchten Sie darauf achten, was gilt ein Brief zu sein, und dies hängt von Ihrem Standort. Mit ISO Latin-1 wird akzentuierte westlichen Sprache Zeichen erlauben angepasst als Buchstaben werden. Im folgende Programm, werden die Standard-Locale é nicht erkennen und daher créé nicht übereinstimmen. Kommentar- den Lokalisierungs-Einstellungen Code, und dann beginnt es zu entsprechen.

Beachten Sie auch, dass \ w Ziffern und den Unterstrich zusammen mit allen Buchstaben enthält. Um nur die Briefe zu erhalten, müssen Sie das Komplement des nicht-alphanum nehmen, Ziffern und Unterstreichungszeichen. Dies läßt nur Buchstaben.

Das könnte einfacher sein, durch Framing es als Frage zu verstehen, „Welche regulären Ausdruck eine Ziffer außer den 3?“, Und die Antwort ist / [^ \ 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

Der folgende Code wird alle Zeichen zurückgeben, die je zweimal oder mehrmals wiederholt wird.

my $ str = "SSSannnkaaarsss";

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

Just for Kicks, ein völlig anderer Ansatz:

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

Zu Ihrer Information, abgesehen von RegexBuddy, eine wirklich praktisch kostenlose Website für reguläre Ausdrücke testen, RegExr bei gskinner.com . Griffe ([[:alpha:]])(\1+) schön.

Wie wäre:

(\w)\1+

Der erste Teil macht eine unbenannte Gruppe um ein Zeichen, dann ist der Rückverweis für den gleichen Charakter aussieht.

Ich denke, das sollte auch funktionieren:

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

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

'u' Modifikator mit Unicode-Anpassung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top