Schrift
[thread]7859[/thread]

regex: mehrere Treffer pro Zeile (Seite 2)

Leser: 2


<< |< 1 2 3 4 5 6 >| >> 57 Einträge, 6 Seiten
supersucker
 2006-04-06 14:29
#64426 #64426
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Quote
Wie willst Du eine Ergebnisliste verarbeiten, wenn if nur auf WAHR oder UNWAHR prüft?


Warum?

Code: (dl )
1
2
if($line =~ m/$regexRfqEmail/g) {
$posEmails{$2} = '';


Das liefert mir doch Treffer.
Und die sind auch im Hash drin.
Nur halt immer der letzte Treffer in der Zeile.
supersucker
 2006-04-06 14:45
#64427 #64427
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Ah,

jetzt verstehe ich was du meinst.
Glaube ich zumindest.
Werd ich gleich probieren.

Danke soweit.

Edit:

Ok,

ich hab den Code jetzt folgendermaßen geändert:

Code: (dl )
1
2
3
4
5
6
7
8
while($line = <rfqInfile>) {

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

}


Dennoch wird immer noch nur der letzte Treffer ausgegeben.
Ich habe noch dunkel was von "greedy matching" und ähnlichem in Erinnerung.
Kann es damit was zu tun haben?
Anders gefragt:

Wie weise ich Perl an das Suchmuster möglichst weit vorne zu erkennen?

Danke für eure Hilfe soweit!\n\n

<!--EDIT|supersucker|1144320824-->
bloonix
 2006-04-06 14:50
#64428 #64428
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo supersucker,

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


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


natürlich matched dies nur test@test.org!

Oder befindet sich ein Leerzeichen vor test@test.de?\n\n

<!--EDIT|opi|1144320718-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Linuxer
 2006-04-06 14:53
#64429 #64429
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Code (perl): (dl )
1
2
3
if ( $line =~ m/(match me)/g ) {
# 
}


Klar, damit wird schon jedes Vorkommen von "(match me)" gefunden, vom ersten bis zum letzten.
Ist es am letzten angekommen, ist das Resultat "WAHR" und Du kannst im WAHR-Zweig dann den letzten geklammerten Ausdruck abfragen (denn die ersten bis zum vorletzten sind überschrieben worden).

Alternativ könnte auch das funktionieren:
Code (perl): (dl )
1
2
3
if ( @results = $line =~ m/(match me)/g ) {
# tu was mit @results; dort sind alle treffer nacheinander enthalten
}
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!
master
 2006-04-06 15:17
#64430 #64430
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
\g = global
aber $2 = nur das 2. gefundene element.
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-06 15:18
#64431 #64431
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
\g  = global
aber $2  = nur das 2. gefundene element.
Du musst die abfrage in eine schleife packen.
zudem hat opi recht....\n\n

<!--EDIT|master|1144322463-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
bloonix
 2006-04-06 15:42
#64432 #64432
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=master,06.04.2006, 13:18]Du musst die abfrage in eine schleife packen.[/quote]
Meinst du sowas...

Code: (dl )
1
2
3
foreach (split /\s+/, $line) {
  doSomeThing($_) if /([a-z0-9\-._]+@[a-z0-9\-.]+\.(de|org))/;
}


? :)

Edit:

müsste auch gehen ...

Code: (dl )
doSomeThing($_) foreach /\s*([a-z0-9\-._]+@[a-z0-9\-.]+\.(de|org))\s*/g;


Falls statt des Leerzeichens auch andere Zeichen auftreten
können - zum Beispiel ein Komma -, muss die Regex verfeinert
werden.\n\n

<!--EDIT|opi|1144324295-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
master
 2006-04-06 15:55
#64433 #64433
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Ja z. B. :-)

Finde es unschön alles in  der regexp zu machen, besonders da ja split z.t. schneller ist. und man hier wunderbar nach leerzeichen splitten kann...

@supersucker
Wenn du einfach nur alle E-mailadressen auslesen willst dann mach das lieber so:

Ganze Datei in String dann den ganzen String durchsuchen in der Art -> //gis und sonst würd ich ein Teil splitten (siehe obi)...\n\n

<!--EDIT|master|1144324774-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
bloonix
 2006-04-06 15:58
#64434 #64434
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
@master, ja, split ist schneller, aber in diesem Fall ist nach dem
split trotzdem eine regexp notwendig.

split + regexp

sollte daher etwas langsamer sein als nur

regexp
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
master
 2006-04-06 16:02
#64435 #64435
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Naja, dafür ist dann die regexp schneller, weil man die
leerzeichen usw. schon berücksichtigt hat


Code: (dl )
foreach (split /\s+|\n/, $line)
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
<< |< 1 2 3 4 5 6 >| >> 57 Einträge, 6 Seiten



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