Thread Regex ausgabe auf Array (9 answers)
Opened by piet at 2010-08-01 10:54

renee
 2010-08-01 11:23
#140201 #140201
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das mit dem Ersetzen durch Hash-Werte sieht dann so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

use strict;
use warnings;

my %ersetzungen = (
    hans => 'Hallo',
    test => 'Welt',
);

my $datei = 'Ein Test: $hans $test.';
my @platzhalter = $datei =~ s/(?<=\$)(.+?)(?![A-Za-z0-9])/$ersetzungen{$1}/g;
print $datei;


Das gibt dann Ein Test: $Hallo $Welt. aus.

s/// ist der Operator für Ersetzungen. Der Teil zwischen den ersten // ist der Suchteil und der Teil zwischen den nächsten // ist der Ersetzungsteil.

Jetzt sieht der Suchteil komplexer aus als in meinem vorherigen Post. Was passiert da? Der Ausdruck (?<=\$) ist ein "Lookbehind". Damit stellt man sicher, dass vor dem eigentlichen Suchausdruck ein Wert vorkommen muss. Allerdings wird dieser Teil dann im Ersetzungsteil nicht ersetzt (Erklärung dazu in dem Link unten). Das habe ich gemacht, weil Du in der Problembeschreibung geschrieben hast, dass nur "hans" in dem Array landen soll und dass soll ersetzt werden. Soll auch das "$" aus "$datei" verschwinden (also das komplette "$hans", dann muss einfach aus (?<=\$) ein \$ werden.

In der zweiten Gruppierung ((.+?)) landet dann der Bezeichner des Platzhalters (hier: "hans" bzw. "test") in $1.

Danach folgt ein "Negative lookahead", mit dem man festlegen kann, was auf etwas "nicht" folgen darf. Da hier das lookahead schon "negativ" ist, wird die Zeichenklasse nicht mehr negiert. Auch hier wird der lookahead nicht ersetzt, denn das Leerzeichen bzw. der Punkt in dem Beispiel soll ja nicht ersetzt werden.

Mehr zu Lookahead und Lookbehind: http://www.regular-expressions.info/lookaround.htm...

Übrigens ist CPAN:YAPE::Regexp::Explain ein tolles Tool für Regex-Erläuterungen. Das sagt in diesem Fall:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
The regular expression:

(?-imsx:(?<=\$)(.+?)(?![A-Za-z0-9]))

matches as follows:

NODE EXPLANATION
----------------------------------------------------------------------
(?-imsx: group, but do not capture (case-sensitive)
(with ^ and $ matching normally) (with . not
matching \n) (matching whitespace and #
normally):
----------------------------------------------------------------------
(?<= look behind to see if there is:
----------------------------------------------------------------------
\$ '$'
----------------------------------------------------------------------
) end of look-behind
----------------------------------------------------------------------
( group and capture to \1:
----------------------------------------------------------------------
.+? any character except \n (1 or more times
(matching the least amount possible))
----------------------------------------------------------------------
) end of \1
----------------------------------------------------------------------
(?! look ahead to see if there is not:
----------------------------------------------------------------------
[A-Za-z0-9] any character of: 'A' to 'Z', 'a' to
'z', '0' to '9'
----------------------------------------------------------------------
) end of look-ahead
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/

View full thread Regex ausgabe auf Array