Thread Conditional RegExp (8 answers)
Opened by PHilbs at 2010-02-20 20:44

vifo
 2010-02-20 22:20
#133389 #133389
User since
2010-01-25
11 Artikel
BenutzerIn
[default_avatar]
Hallo,

wenn Du unbedingt conditional expressions verwenden möchtest, ist das hier eine Lösungsmöglichkeit;

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my $blub = "hund:bello,12,w";
my $blab = "katze:mini,m";

my $pattern = qr{
^(?:(?<t>hund)|(?<t>katze)) # hund oder katze, zusätzlich in \1 und \2 capturen
\: # trenner
(?<n>[^\,]+) # name
\, # trenner
(?(1)
(?<g>\d+) # gewicht nur wenn \1 gematcht hat (e.g. hund)
\, # trenner
)
(?<s>m|w) # geschlecht
$
}x;


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
$VAR1 = {
'n' => 'bello',
'g' => '12',
's' => 'w',
't' => 'hund'
};
$VAR1 = {
'n' => 'mini',
's' => 'm',
't' => 'katze'
};


Bei den conditional expressions kannst Du als condition einen bereits gematchten Ausdruck verwenden. Allerdings kann man hier nur feststellen, OB der Ausdruck gematcht hat, nicht dessen Inhalt (das geht wiederum mit code evaluation expressions, siehe http://perldoc.perl.org/perlretut.html#A-bit-of-magic:-executing-Perl-code-in-a-regular-expression, aber das wird als experimentell eingestuft).

Also capturen wir zusätzlich entweder "hund" oder "katze" in $1 bzw. $2 und prüfen hierauf.

Eine weitere Alternative wäre natürlich, die Strings so umzustellen, dass das Gewicht als letztes Element steht (dann würde auch einfaches split reichen).

Grüße
vifo

Edit: siehe gerade, Murphy war mit der Lösung ein bisschen schneller, aber doppelt hält besser :)
Last edited: 2010-02-20 22:22:15 +0100 (CET)

View full thread Conditional RegExp