Schrift
[thread]7859[/thread]

regex: mehrere Treffer pro Zeile

Leser: 2


<< |< 1 2 3 4 ... 6 >| >> 57 Einträge, 6 Seiten
supersucker
 2006-04-06 13:29
#64416 #64416
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Hi zusammen,

ich parse einen Text der pro Zeile mehrere email-adressen enthält mit folgendem regex:

Code: (dl )
1
2
3
4
5
my $regexEmail = qw((\s+)([a-z0-9\-._]+@[a-z0-9\-.]+\.(de|org))(\b));
.....

if($line =~ m/$regexRfqEmail/go)
//tu was


Das Erkennen von emails klappt auch, allerdings wird immer nur die letzte email innerhalb einer Zeile erkannt.
Ich dachte das ich Perl durch den Schalter "\g" anweise in der kompletten Zeile alle passenden Suchmuster zu finden.
Dies ist aber nicht der Fall.

Wäre nett wenn mir einer einen Tip geben könnte.

So long...
master
 2006-04-06 13:35
#64417 #64417
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
willst du die Emails auf richtigkeit prüfen?
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-06 13:37
#64418 #64418
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
nimm das o  raus..
o = suchmuster nur 1 mal.

mach es doch einfacher in dem du zuerst die Zeile per leerzeichen splittest. und dann die emails prüfst

ich habe mir dein regex nicht genau angesehen, aber es kann sein, das es z. B. als 1 Emailadresse ansieht.
"abc@abc.de xx@yy.com"
so in der Art
"abc....<egal was kommt>....com"

d.h du musst die Regex so aufbauen, das sie nur bis zum leerzeichen prüft... und dann kannst du gerade so gut splitten und einzeln prüfen.. :-)\n\n

<!--EDIT|master|1144316645-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
supersucker
 2006-04-06 13:43
#64419 #64419
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Quote
willst du die Emails auf richtigkeit prüfen?


Nein, es geht nur um die Extraktion. Es handelt sich um Kunden-emails, die später sowieso manuell eingepflegt werden.

Quote
nimm das o raus..
o = suchmuster nur 1 mal.


Das hat nichts gebracht.

In folgender Zeile:

Code: (dl )
test@test.de [EMAIL=test@test.org]test@test.org[/EMAIL]


wird immer nur der letzte Eintrag, also test@test.org erkannt.

\o bedeutet doch das das Suchmuster nur einmal kompiliert wird oder?
master
 2006-04-06 13:47
#64420 #64420
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
wie sieht denn dein code vollständiger aus?
was machst du in der abfrage?
Ich erhalte nämlich denn kompletten string und NICHTS vorne oder hinter dem suchmuster..
es findet bei mir also alles..
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-06 13:51
#64421 #64421
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
ich habe deinen code mal abgeändert, so das es
das gefundene durch X ersetzt
Code: (dl )
1
2
3
4
5
$line = 'huber@go.com  peter@muh.com';
my $regexEmail = qw((\s+)([a-z0-9\-._]+@[a-z0-9\-.]+\.(de|org))(\b));

$line =~ s/$regexRfqEmail/X/gi;
print $line;


Irgendwas läuft schief. (siehe Ausgabe)
Du willst doch die ganze Mailadresse oder?

Ausgabe:
Code: (dl )
[EMAIL=XtXeXsXtX@XtXeXsXtX.XdXeX]XtXeXsXtX@XtXeXsXtX.XdXeX[/EMAIL] [EMAIL=XtXeXsXtX@XtXeXsXtX.XoXrXgX]XtXeXsXtX@XtXeXsXtX.XoXrXgX[/EMAIL]


ps. Es ist einfacher die Emails einzeln zu betrachten, als eine
komplizierte regexp. zu machen. Deine regexp. sollte immer so einfach wie möglich sein.\n\n

<!--EDIT|master|1144317217-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
supersucker
 2006-04-06 13:54
#64422 #64422
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $regexRfqEmail = qw((\s+)([a-z0-9\-._]+@[a-z0-9\-.]+\.(de|org))(\b));

print "parsing rfq_infile..\n";

open(rfqInfile, $rfqInfile) or die("could not open rfqInfile: " . $rfqInfile);

while($line = <rfqInfile>) {

$line = lc($line);
if($line =~ m/$regexRfqEmail/g) {
$posEmails{$2} = '';
// debug
print "email : " . $2 . "\n";
}


Wird eine email gefunden, wird sie in einem Hash namens posEmails eingetragen. Hash deshalb weil ich die emails die mehrfach vorkommen nur einmal eintragen möchte. Da mich nur key, also die emails interessieren setze ich den value auf ''.
pq
 2006-04-06 14:04
#64423 #64423
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=master,06.04.2006, 11:37]nimm das o  raus..
o = suchmuster nur 1 mal.[/quote]
nein.
es bedeutet: kompiliere das suchmuster nur einmal. das sollte aber hier
kein problem sein, denn das suchmuster wird ja auch nur einmal gesetzt.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
supersucker
 2006-04-06 14:14
#64424 #64424
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Hm, ok.

aber sieht nun jemand den Fehler?

Wie schon gesagt, ich dachte \g heisst liefert alle Treffer in einer Zeile.
Google bestätigt mich darin.
Dennoch wird immer nur der letzte Treffer angezeigt.

Muss ich evtl. noch was in meiner regex ändern?

Danke für die Hilfe soweit.
Linuxer
 2006-04-06 14:26
#64425 #64425
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Wie willst Du eine Ergebnisliste verarbeiten, wenn if nur auf WAHR oder UNWAHR prüft?

Versuch mal etwas der Art:
Code (perl): (dl )
1
2
3
while ( $line =~ m/(match me)/g ) {
  # tu was mit  Å© <- dass sollte "$ 1" sein, ohne "" und ohne Leerzeichen; Board-Feature? Board-Bug?
}
\n\n

<!--EDIT|Linuxer|1144319346-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< |< 1 2 3 4 ... 6 >| >> 57 Einträge, 6 Seiten



View all threads created 2006-04-06 13:29.