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