Schrift
[thread]8182[/thread]

Anfängerfrage: Regex geht nicht: Regex geht nicht



<< >> 6 Einträge, 1 Seite
Gast Gast
 2006-07-19 17:49
#68269 #68269
Hallo,

ich habe Textzeilen in dem Format
"Max Muster" <max-muster@muster_test-2.de>foo-bar-sonstwas-oderauchnix>

Ich benötige daraus die Domain (hier: muster_test-2.de).

Aber wie? Ich habe folgendes in vielen Variationen versucht:

$test1 = "Max Muster \<max-muster@muster_test-2.de\>foo-bar-sonstwas-oderauchnix\>";
if ($test1 =~ /\@(.*?)>/)
{
print "dollar 1: $1 \n";
}

Aber ich bekomme nie das gewünschte Ergebnis.
Aber warum? Und wie mache ich es richtig?

Gruß
RIchard Kaufmann
Crian
 2006-07-19 17:55
#68270 #68270
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
nimm mal einfache Anführungszeichen beim Definieren von $test ... oder lass dir mal den Inhalt ausgeben oder benutze strict und warnings

Code: (dl )
1
2
3
4
5
C:\Daten\perl>perl
$test1 = "Max Muster \<max-muster@muster_test-2.de\>foo-bar-sonstwas-oderauchnix\>";
print $test1;
^Z
Max Muster <max-muster-2.de>foo-bar-sonstwas-oderauchnix>


Code: (dl )
1
2
3
4
5
6
7
8
9
C:\Daten\perl>perl
use strict;
use warnings;
my $test1 = "Max Muster \<max-muster@muster_test-2.de\>foo-bar-sonstwas-oderauchnix\>";
Possible unintended interpolation of @muster_test in string at - line 3.
print $test1;
^Z
Global symbol "@muster_test" requires explicit package name at - line 3.
Execution of - aborted due to compilation errors.


Code: (dl )
1
2
3
4
5
6
7
C:\Daten\perl>perl
use strict;
use warnings;
my $test1 = 'Max Muster <max-muster@muster_test-2.de>foo-bar-sonstwas-oderauchnix>';
print $test1;
^Z
Max Muster <max-muster@muster_test-2.de>foo-bar-sonstwas-oderauchnix>


alles klar? :-)\n\n

<!--EDIT|Crian|1153317969-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
docsnyder
 2006-07-20 16:22
#68271 #68271
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi Richard!

Versuch's mal so:

Code: (dl )
1
2
3
4
5
$test = 'Max Muster <max-muster@muster_test-2.de>foo-bar-sonstwas-oderauchnix>';

if ($test =~ /\@([^>]+)>/) {
print "domain: $1\n";
}


Gruß, Doc
renee
 2006-07-20 17:42
#68272 #68272
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Benutz CPAN:Email::Find. Da bekommst Du dann mit $email->host den hostnamen...
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/
AndreasM
 2006-07-21 13:49
#68273 #68273
User since
2005-10-08
31 Artikel
BenutzerIn
[Homepage] [default_avatar]
Aber um nochmal auf die ursprüngliche Frage zurückzukommen:

Code: (dl )
if ($test1 =~ /\@(.*?)>/)


Du hast da zwei Quantifier direkt hintereinander, nämlich * und ?, da stolpert die Regex.

In Deiner ursprünglichen Form hätte
Code: (dl )
if ($test1 =~ /\@(.+)>/)
besser gepasst.

Grüße
AndreasM\n\n

<!--EDIT|AndreasM|1153475432-->
renee
 2006-07-21 14:36
#68274 #68274
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nee, da stolpert die Regex nicht. Damit verhindert man zu gierige Reguläre Ausdrücke.

Vergleiche:
Code: (dl )
1
2
~/entwicklung 115> perl -le 'my $string = q~Dies ist ein Test.~; my ($found) = $string =~ /(.*)i/; print $found'
Dies ist e


vs.

Code: (dl )
1
2
~/entwicklung 116> perl -le 'my $string = q~Dies ist ein Test.~; my ($found) = $string =~ /(.*?)i/; print $found'
D


Im ersten Fall nimmt er soviel wie es geht - also bis zum letzten 'i' und im zweiten Fall nimmt er so wenig wie möglich - also bis zum ersten 'i'.
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/
<< >> 6 Einträge, 1 Seite



View all threads created 2006-07-19 17:49.