Kurt Z: Regex! Suche ein Wort mit Buchstaben UND Zahlen

Beitrag lesen

Hi

if( !$data{'passwort'} =~ /[a-z].\d|\d.[a-z]/i )
{
  print qq~
   Kein Treffer
  ~;
}


>   
> Gibt bei mir "Kein Treffer" für abcedefghijk...  
>   
> Hab soeben aber gemerkt, dass  
>   
> ~~~perl
  

> if( $data{'passwort'} !~ /[a-z].*\d|\d.*[a-z]/i )  
> {  
>   print qq~  
>    Kein Treffer  
>   ~;  
> }  
> 

... hingegen so funktioniert, wie ich das gern möchte.

Hm.

interessant gell? Versuche mal "not" statt ! oder Klammer den Ausdruck vorm negieren oder benutze "unless" statt "if":

#~~~perl

$="\n"; # print mit newline

$data='abcedefghijk';

if( ! $data =~ /[a-z].\d|\d.[a-z]/i )
 { print "Match ! =~";}

if( not $data =~ /[a-z].\d|\d.[a-z]/i )
 { print "Match not =~";}

if( ! ($data =~ /[a-z].\d|\d.[a-z]/i) )
 { print "Match !( =~ )";}

unless( $data =~ /[a-z].\d|\d.[a-z]/i )
 { print "Match unless( =~ )";}

if( ! $data == "" )
 { print "Match !$data==Leerstring";}

  
  
Bei deiner Schreibweise wird $data erst negiert und damit zum Leerstring.  
  
"!" hat eine verdammt hohe Operatorprezedenz, höher als =~ ...  
deswegen lieber "not" nehmen.  
  
Oder noch besser die Lösung mit den zwo einfachen RegExes die mit && verknüpft werden:  
  
~~~perl
  
print 'ziffer und buchstaben vorhanden' if ( $str=~/[a-z]/i && $str=~/\d/ );  

Die ist nämlich sofort lesbar, nach längerer Zeit sofort verständlich und damit WARTBAR. (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")

Alle anderen Regexes bei deiner Fragestellung sind IMHO letztendlich intellektuelle Masturbation und höchstens bei sehr zeitkritischen Anwendungen sinnvoll.

Gruß
 Kurt