Regex: Wiederholung eines beliebigen Zeichens mehr als x-mal
Regex: Wiederholung eines beliebigen Zeichens mehr als x-mal
am 24.07.2007 13:06:05 von Peter Honka
Hallo,
habe Probleme mit einem RegEx.
Suche Vorkommen von einem beliebigen Zeichen,
dass in Reihe mehr als 10x wiederholt wird.
Wenn dieses Zeichen z.B. ein "f" wäre:
$foo = "Das ist nur Futter für den RegEx ffffffffffffffff - blaa, blaa";
Könnte ich folgenden RegEx verwenden:
if ($foo =~ s/f{10}//)
{
print "f-Ansammlung gröÃer 10 entfernt";
}
Dann entfernt der RegEx brav die fff´s, die über die 10´te Wiederholung
hinaus gehen.
Und wie würde der Regex nun lauten, wenn ich ein beliebiges
Zeichen, dass mehr als 10x in Reihe vorkommt, entfernen möchte?
if ($foo =~ s/.{10}//) # geht leider nicht...
Danke und Gruss
Peter Honka
Re: Regex: Wiederholung eines beliebigen Zeichens mehr als x-mal
am 24.07.2007 13:37:49 von Christian Kirsch
Am 24.07.2007 13:06 schrieb Peter Honka:
> Hallo,
>
> habe Probleme mit einem RegEx.
>
> Suche Vorkommen von einem beliebigen Zeichen,
> dass in Reihe mehr als 10x wiederholt wird.
>
> Wenn dieses Zeichen z.B. ein "f" wäre:
>
> $foo = "Das ist nur Futter für den RegEx ffffffffffffffff - blaa, blaa";
>
> Könnte ich folgenden RegEx verwenden:
>
> if ($foo =~ s/f{10}//)
> {
> print "f-Ansammlung gröÃer 10 entfernt";
> }
>
> Dann entfernt der RegEx brav die fff´s, die über die 10´te Wiederholung
> hinaus gehen.
>
> Und wie würde der Regex nun lauten, wenn ich ein beliebiges
> Zeichen, dass mehr als 10x in Reihe vorkommt, entfernen möchte?
>
> if ($foo =~ s/.{10}//) # geht leider nicht...
"geht leider nicht" ist als Fehlerbeschreibung denkbar ungeeignet.
Ich vermute, Du möchtet zehn aufeinanderfolgende Zeichen entfernen
(auch wenn Du immer "mehr als 10" schreibst: {10} passt m.W. auf
*genau* 10 Zeichen).
Das könnte etwa so funktionieren:
s/(.)\1{9}//
Also erst das Zeichen auswählen, dann dasselbe noch neumal. Wenn es
*mindestens* 10 sein sollen:
s/(.)\1/{9,}//
Disclaimer: Nichts davon ist getestet. Friedls Buch zu Regulären
Ausdrücken ist die in diesem Zusammenhang relevante Bibel.
--
Christian
Re: Regex: Wiederholung eines beliebigen Zeichens mehr als x-mal
am 24.07.2007 13:40:11 von Bjoern Hoehrmann
* Peter Honka wrote in de.comp.lang.perl.misc:
>Und wie würde der Regex nun lauten, wenn ich ein beliebiges
>Zeichen, dass mehr als 10x in Reihe vorkommt, entfernen möchte?
>
>if ($foo =~ s/.{10}//) # geht leider nicht...
Das geht nur mit Backreferenzes, also /(.)\1{9}/ (ein Zeichen
gefolgt von neun mal demselben Zeichen).
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
68309 Mannheim · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/
Re: Regex: Wiederholung eines beliebigen Zeichens mehr als x-mal
am 24.07.2007 15:20:29 von Peter Honka
> Also erst das Zeichen auswählen, dann dasselbe noch neumal. Wenn es
> *mindestens* 10 sein sollen:
> s/(.)\1/{9,}//
Herzlichen Dank.
Gruss
Peter
Re: Regex: Wiederholung eines beliebigen Zeichens mehr als x-mal
am 24.07.2007 17:06:36 von Mirco Wahab
Peter Honka wrote:
> Suche Vorkommen von einem beliebigen Zeichen,
> dass in Reihe mehr als 10x wiederholt wird.
> Wenn dieses Zeichen z.B. ein "f" wäre:
> $foo = "Das ist nur Futter für den RegEx ffffffffffffffff - blaa, blaa";
>
> if ($foo =~ s/.{10}//) # geht leider nicht...
neben den korrekten Varianten von Christian und Bjoern
gibt es noch eine "indirekte" Methode, die evtl. noch
erweiterbar ist:
...
my $foo = "Das ist nur Futter für den RegEx ffffffffffffffff - blaa, blaa";
if( $foo =~ s/(?=(.))(??{ "[$1]{10,}" })// ) {
print "\"$1\"-Wiederholungen ab 10 entfernt\n"
}
print "$foo\n";
...
(nur als zusätzliche Information gedacht)
Viele Grüße
Mirco