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

murphy
 2010-02-20 22:08
#133388 #133388
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Die Bedingungskonstrukte der Form (?(...)...|...) in einem regulären Ausdruck erlauben standardmäßig nur eine Überprüfung ob ein Subausdruck gepasst hat, nicht auf was er gepasst hat.

Du könntest also zum Beispiel die zulässigen Tiertypen in mehrere Subausdrücke verpacken und dann testen welcher gepasst hat: ^(?:(?<h>hund)|(?<k>katze))...(?(<h>)...|...)...

Wenn Du unbedingt willst, kannst Du auch Code in einen regulären Ausdruck einbetten: ^(?<t>hund|katze)...(?(?{$+{t} eq 'hund'})...|...)... — das ist aber nicht nur recht hässlich und unleserlich, sondern auch explizit in der Dokumentation als experimentell und instabil vermerkt.

Schließlich könnte man gerade in diesem Beispiel auch einfach zweimal splitten und mit gewöhnlichen Abfragen arbeiten:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
my ($kind, $info) = split /:/, ..., 2;

my ($name, $weight, $gender);
if ($kind eq 'hund') {
  ($name, $weight, $gender) = split /,/, $info, 3;
}
else {
  ($name, $gender) = split /,/, $info, 2;
}
When C++ is your hammer, every problem looks like your thumb.

View full thread Conditional RegExp