Schrift
[thread]11757[/thread]

regex Frage (reihenfolge)



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Froschpopo
 2008-05-06 13:10
#109244 #109244
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Habe folgenden Regex:
Code (perl): (dl )
1
2
3
$str = "aha33";

$str =~ /(\d+?)([a-zA-Z]+?)/;

Mein Problem:
Ich brauche WAHR, wenn $str mindestens 1 Zahl und mindestens 1 Buchstaben enthält.
Leider ist bei meinem Beispiel die Reihenfolge nicht egal.

$str = "33aha"; # ergibt WAHR
$str = "aha33"; # ergibt FALSCH

Letzteres soll aber auch WAHR sein!
Ich will nur prüfen, ob Zahl UND Buchstabe vorkommen. Die Reihenfolge soll dabei egal sein.

Jetzt könnte man natürlich sowas machen wie...
Code (perl): (dl )
$str =~ /\d+?[a-zA-Z]+?|[a-zA-Z]+?\d+?/;

Aber das wird dann kompliziert, wenn der regex komplexer wird. Dann muss ich das ODER jedesmal berücksichtigen.
pktm
 2008-05-06 13:23
#109247 #109247
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Viel einfacher wirst du das wohl schlecht bekommen, denn du hast nunmal den Fall einer Disjunktion vorliegen. Du könntest deine Regex allerdings etwas modifizieren: m/(?:\d+\w+)|(?:\w+\d+)/. Finde ich leserlicher.
Schlussendlich kann man die dann meines Wissens auch noch ineinander einbetten.
http://www.intergastro-service.de (mein erstes CMS :) )
Froschpopo
 2008-05-06 13:25
#109248 #109248
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
hmm warum ich die Klammern beim zweiten Beispiel weggelassen habe weiss ich jetzt auch nicht mehr. Aber du machst ja im prinzip auch dasselbe mit dem ODER.
Aber warum eigentlich \w das enthält doch schon 0-9. Das gäbe ja dann auch WAHR, wenn $str nur Zahlen enthält. Klar: Sieht natürlich schöner aus.
Struppi
 2008-05-06 13:27
#109250 #109250
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Froschpopo
 2008-05-06 13:28
#109251 #109251
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Die Antworten dort kamen mir irgendwie zu schwammig vor, dass ich nochmal die Fachleute fragen wollte :)
Im zweiten Thread waren sich die Antworter ja auch nicht besonders einig.
Das doofe im Selfhtml-Forum ist ja, dass man, wenn der Thread weiter "unten" und älter als ein tag ist, kaum mehr antworten bekommt.
Auch registrierte Mitglieder antworten nur ziemlich selten wieder.
moritz
 2008-05-06 13:56
#109252 #109252
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Lookaheads können dir das "oder" einsparen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
use strict;
use warnings;
use Test::More tests => 4;
my $re = qr{(?=.*?\d)(?=.*[a-zA-Z])};
for (qw(abc123 123abc)){
    like $_, $re;
}
for (qw(123 abc)){
    unlike $_, $re;
}


Allerdings verbrauchen die keine Zeichen, je nach Regex kann es das sein was du willst, oder eben auch nicht.
Struppi
 2008-05-06 14:05
#109254 #109254
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Froschpopo+2008-05-06 11:28:54--
Das doofe im Selfhtml-Forum ist ja, dass man, wenn der Thread weiter "unten" und älter als ein tag ist, kaum mehr antworten bekommt.
Auch registrierte Mitglieder antworten nur ziemlich selten wieder.
Natürlich, wenn du nicht darauf reagierst.
Registrierte Benutzer verwenden aber oft eine andere Sortiereihenfolge, daher stimmt deine erste Aussage nicht, bei mir rutschen die Threads nicht nach unten, solange noch Antworten kommen.
sid burn
 2008-05-06 14:35
#109256 #109256
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Total simple und noch übersichtlicher ist es wenn du einfach zwei regexe nutzt.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub has_num_and_char {
my ( $str ) = @_;

if ( $str !~ m/\d/xms ) {
return;
}

if ( $str !~ m/[a-z]/xmsi ) {
return;
}

return 1;
}
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pktm
 2008-05-06 16:56
#109273 #109273
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Froschpopo+2008-05-06 11:25:32--
hmm warum ich die Klammern beim zweiten Beispiel weggelassen habe weiss ich jetzt auch nicht mehr. Aber du machst ja im prinzip auch dasselbe mit dem ODER.
Aber warum eigentlich \w das enthält doch schon 0-9. Das gäbe ja dann auch WAHR, wenn $str nur Zahlen enthält. Klar: Sieht natürlich schöner aus.


Ach ja, \w enthält ja alle alphanumerischen Zeichen... stimmt.
Zu den Klammern: Gilt nicht automatisch immer der kleinste Skopus?
http://www.intergastro-service.de (mein erstes CMS :) )
Linuxer
 2008-05-06 17:10
#109276 #109276
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
pktm+2008-05-06 14:56:54--
Ach ja, \w enthält ja alle alphanumerischen Zeichen... stimmt.
Zu den Klammern: Gilt nicht automatisch immer der kleinste Skopus?


'perldoc perlre'
\w Match a "word" character (alphanumeric plus "_")


\w enthält die alphanumerischen Zeichen und den Unterstrich.
Also Vorsicht, es mag dadurch Treffer geben, die vielleicht nicht erwünscht sind.
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 >| >> 13 Einträge, 2 Seiten



View all threads created 2008-05-06 13:10.