[PINGUIN] Reguläre Ausdrücke

Henning Oschwald listmail at hoschwald.de
Do Jul 5 14:02:56 CEST 2007


Huhu,

On Do, Jul 05 2007, Sebastian Dellit wrote:

> Folgendes zu regulären Ausdrücken, ob ich es verstanden habe, wobei
> ich jeweils in der ersten Zeile etwas aus dem Netz kopiert habe und in
> der zweiten - von einem * angekündigt - werde ich es so schreiben, wie ich es verstehe:
>
> c Ein einzelner Buchstabe passt auf sich selbst.
> * Das verstehe ich nicht. Wie kann ich mit c einen regex machen? Denn c
> kommt ja oft genug in Texten vor. ;-)

Vergiss das c einfach, das war nur beispielhaft für einen
Buchstaben. Die Aussage ist, daß ein Buchstabe sich selbst repräsentiert -
jaaaahh, das muß man sich mal auf der Zunge zergehen lassen. ;-)

> . Ein Punkt steht für genau einen beliebigen Buchstaben, außer das Zeilenende.
> * Ich kann also mit einem Punkt jeweils ein Zeichen ersetzen. Also ein
> Wildcard für ein Zeichen? h.l könnte also hal, hol, hul, ... bedeuten?

jep.

> ? Das dem Operator ? voranstehende Zeichen null oder einmal.
> * Wenn ich hinter ein Zeichen das ? setze, so heißt es, das das vorige
> Zeichen 0, oder einmal existieren muss.

jap.

> * >Das dem Operator * voranstehende Zeichen null mal oder öfter.
> * Wie oben, nur kann es auch mehrmals auftreten. Z. B. könnte " *"
> bedeuten, dass das Leerzeichen keinmal, 1 mal oder mehrmals auftaucht.

Jup.

> Hier weiß ich nicht, ob das größer Zeichen richtig ist?

Nee, das ist vermutlich irgendwie dazwischengerutscht.

> + Das dem Operator + voranstehende Zeichen ein mal oder öfter.
> * Wie oben, nur das es mind. 1 mal vorhanden sein muss.

jop.

> ^ Das Caret (^) bedeutet Zeilenanfang.
> * Wenn man diesen Operator nutzt, muss die folgende Zeichenkette am
> Anfang der Zeile sein?

jawoll.

> $ Das Dollarzeichen ($) bedeutet Zeilenende.
> * Wenn man diesen Operator hinter einer Zeichenkette verwendet, so muss
> diese Zeichenkette am Ende sein?

Genau.

> < Bedeutet Wortanfang.
[...]
>> Bedeutet Wortende.

Bin ich mir grad nicht sicher. Wenn ja, muß es je nach Dialekt
evtl. maskiert werden.

> [Buchstaben] Ein Buchstabe aus der Menge.
> * [abc[b|c|] würde bedeuten, das nach abc, abd geschaut wird?

Hmm... das Beispiel versteh ich nicht wirklich, die Pipe ist aber wohl
faslhc.

Du kannst in den eckigen Klammern die Zeichen definieren, die an dieser
Stelle vorkommen dürfen, damit der Ausdruck matcht. Stell es Dir wie ein
eingeschränktes Wildcard vor. Innerhalb der eckigen Klammern kannst Du
die möglichen Zeichen entweder direkt hintereinander aufzählen oder
Bereiche angeben, z. B.:
[0-9A-Z_]
An dieser Stelle darf entweder eine Ziffer zwischen 0 und 9, ein
Großbuchstabe zwischen A und Z oder ein Underscore stehen.

> [^Buchstaben] Ein Buchstabe, der NICHT in der Menge steht.
> * abc[^d] würde abc aber nicht abd bedeuten?

Exakt, abce wäre aber wiederum erlaubt.

> (...) Zusammenfassung eines Ausdrucks. Wichtig zum Ersetzen.
> * Damit macht man genau was? Vermutlich wird das, was in den Klammern
> steht, genau so genommen?

Nein, der Ausdruck in den runden Klammern wird in einer Variablen
abgelegt, auf die zu einem späteren Zeitpunkt, beispielsweise im
Ersetzungsausdruck wieder zugegriffen werden kann.

Hier mal ein kleines Perl-Beispiel zur Verdeutlichung:

--8<---------------cut here---------------start------------->8---
$str = 'Hallo, das ist ein Test.';
$str =~ s/^(Hallo).*(Test)/$1 $2/;
print "$str\n";
--8<---------------cut here---------------end--------------->8---

Führt man den Dreizeiler aus, wird "Hallo Test" ausgegeben.




sich "gemerkt" und kann
z. B. beim Ersetzen

> | Ein logisches ODER mit dem verschiedene Ausdrücke verknüpft werden können.
> * Kann verwendet werden, um mehrere Zeichen an einer oder mehreren
> Stellen möglich zu machen, siehe oben.

Ja, im obigen Beispiel ist die Pfeife aber wie gesagt fehl am Platz.

Beispiel mit der Pipe gefällig?:

Hallo altes? (Haus|Hütte|Schlachtross)
 
> Nun habe ich ein Beispiel, welches nicht so recht funktionieren mag:

> fetchmail[3864]: Do 05 Jul 2007 11:00:05 CEST: schlafe 300 Sekunden lang
>
> und mein regex sieht so aus:
>
> fetchmail\[[0-9]+\]: +[a-z]+ +[0-9]+
>
> Aber er funktioniert leider noch nicht. :-(

Weil Du mit [a-z]+ nur Kleinbuchstaben zulässt, das D in 'Do 05 Jul
2007' jedoch großgeschrieben ist.

HTH

  Henning