Avatar billede aey Nybegynder
19. april 2002 - 22:52 Der er 11 kommentarer og
2 løsninger

skal- og må ikke indeholde, på engang

Jeg har ikke rodet så meget med reg.exp før, men jeg kan ikke finde et eksempel, der kan løse mit problem, nogen steder..

En, af en bruger indtastet, tekststreng skal indeholde præcis 8 tegn, alle skal være enten a-z el. 0-9 og min. et tegn fra hver pulje (a-z og 0-9), kan det lade sig gøre?

Hvis det er muligt kunne det være cool med lidt javascript til àlá

if (regstr.test("tststrng"))
  window.alert("perfekt")
else
  window.alert("er du dum?")
Avatar billede boris Mester
20. april 2002 - 00:07 #1
<html>
<head>
    <title>Untitled</title>
    <script>   
    function udtryk()
    {
    var bogstav = 0;
    var tal = 0;
    var ialt= 0;
    var tekst = komiform.teksten.value;;
    var i= 0;
    while(i<tekst.length)
        {       
        if ((tekst.charAt(i)>=0)&&(tekst.charAt(i)<=10))
        {
        tal++
        }
        if ((tekst.charAt(i)>='a')&&(tekst.charAt(i)<='z'))
        {
        bogstav++
        }
        ialt++;   
        i++;
        }
    if ((tal == 4)&&(ialt==8))
    alert("perfekt")
    else
    alert("Du er alternativt begavet");   
    }   
    </script>
   
</head>
<body>
<form name = "komiform">
<input type="Text" id = "teksten" >Skriv et ord<br>
<input type="Submit"  onmousedown="udtryk()">
</form>
</body>
</html>
Avatar billede boris Mester
20. april 2002 - 00:13 #2
Jeg så lige, at jeg havde læst dit spørgsmål forkert som at der skulle være lige mange tal og bogstaver. Her er det ændret, så der bare skal være mindst et af hver slags og ingen forkerte:
<html>
<head>
    <title>Untitled</title>
    <script>   
    function udtryk()
    {
    var bogstav = 0;
    var tal = 0;
    var ialt= 0;
    var tekst = komiform.teksten.value;;
    var i= 0;
    while(i<tekst.length)
        {       
        if ((tekst.charAt(i)>=0)&&(tekst.charAt(i)<=10))
        {
        tal++
        }
        if ((tekst.charAt(i)>='a')&&(tekst.charAt(i)<='z'))
        {
        bogstav++
        }
        ialt++;   
        i++;
        }
    if ((tal)&&(bogstav)&&(ialt==8)&&(ialt==tal+bogstav))
    alert("perfekt")
    else
    alert("Du er alternativt begavet");   
    }   
    </script>
   
</head>
<body>
<form name = "komiform">
<input type="Text" id = "teksten" >Skriv et ord<br>
<input type="Submit"  onmousedown="udtryk()">
</form>
</body>
</html>
Avatar billede aey Nybegynder
20. april 2002 - 00:15 #3
det er der ikke specielt meget reg.exp over :D
Det er noget ligende jeg bruger nu, men det ligner jo noget der er løgn.. :P ihvertfald hvis man kan nøjes med et enkelt reg.exp test kald
Avatar billede eeyore Nybegynder
20. april 2002 - 00:17 #4
sidder og tænker... giv mig et øjeblik *ss*
Avatar billede eeyore Nybegynder
20. april 2002 - 00:38 #5
Ok... måske er det for sent...

Her er noget kode, der virker, men jeg blev nødt til at se mig slagen på at få RegEx'en til at checke for længden samtidig med (i hvert fald i JavaScript)...

RegEx'en checker for, at strengen kun indeholder a-z og 0-9 og mindst en af hver... og så må jeg så give fortabt og bagefter checke på længden *snøft*

MVH
eeyore

<script language="JavaScript">
var string = '1234a678';
if(string.match(/^(?=.*[a-z])(?=.*[0-9])[a-z0-9]*$/) && string.length==8) {
    alert('perfekt');
}
else {
    alert('farvel!');
}
</script>
Avatar billede jespernaur Nybegynder
20. april 2002 - 00:38 #6
Det er ikke så simpelt at gøre det i eet hug, så her er en løsning i tre hug:

function chktxt( txt )
{
  var r1 = new RegExp(/^[a-z0-9]{8}$/); // Præcis 8 tegn, bogstaver og cifre
  var r2 = new RegExp(/[a-z]/);        // Mindst et bogstav
  var r3 = new RegExp(/[0-9]/);        // Mindst et ciffer

  if (txt.match(r1) && txt.match(r2) && txt.match(r3)) {
      alert("perfekt " + txt);
  }
  else {
      alert("er du dum: " + txt);
  }
}

Mvh
Jesper Naur
Avatar billede eeyore Nybegynder
20. april 2002 - 00:44 #7
Måske skulle jeg være så venlig at give lidt forklaring til RegEx'en (dette forum er jo til for at vi alle kan blive klogere... *s*):

/^(?=.*[a-z])(?=.*[0-9])[a-z0-9]*$/

^ matcher på begyndelsen af strengen
$ matcher på slutningen

(?= ... )  er en lookahead RegEx, dvs. fylder nul tegn, men er opfyldt, hvis den matcher SENERE i strengen

[a-z] og [0-9] og [a-z0-9] er klasser, der matcher ét tegn, der falder inden for rangen

. matcher ethvert tegn

* betyder at foregående tegn skal forekomme 0-n gange

----------
Håber jeg har været til en smule hjælp ;-)
Avatar billede boris Mester
20. april 2002 - 00:45 #8
Helt principielt mener jeg ikke, det er i orden, at du afviser et svar, som faktisk fungerer, inden du har set, om der kommer en bedre løsning på spørgsmålet.
Avatar billede aey Nybegynder
20. april 2002 - 00:52 #9
boris -> pricipielt vil jeg da gi' dig ret...
jeg er ked af at det ikke er mere tydeligt at det er en reg.exp løsning jeg er ude efter; meeennnn ..  eftersom at dette er reg.exp-kategorien og jeg endda begrunder min afvisning, har jeg ikke dårlig smag i munden :D
Avatar billede aey Nybegynder
20. april 2002 - 01:58 #10
eeyore -> det er super ... men jeg venter lige og ser om der er en der kan klare det; det er mærkeligt, men jeg er lidt fasineret af denne næsten sprog-uafhængige funktionalitet... måske jeg skulle blive lidt bedre til det.
Avatar billede boris Mester
20. april 2002 - 08:19 #11
RegExp er da en fin ting.
Og kan det gøres med et enkelt udtryk i dit tilfælde, er det alle tiders.
Eksemplet med .match ser glimrende ud - selvom det ikke er den korte version, du efterlyste og ikke er RegExp, men match.
Jeg accepterer fuldt ud, at du har afvist mit svar i forhold til de andre svar, der kom til senere;
men bestemt ikke, at du gjorde det inden du havde set en bedre (enklere) løsning.
Avatar billede eeyore Nybegynder
20. april 2002 - 23:04 #12
Jeg kan nu godt få det til at funke i perl:

#!/usr/bin/perl 

my $string = '1234b789'; if($string =~ /^(?=.*[a-z])(?=.*[0-9])[a-z0-9]{8}$/) {   

  print "perfekt\n";
}
  else {
  print "farvel\n";
}

Men af en eller anden grund ikke i JavaScript :-(
Avatar billede eeyore Nybegynder
20. april 2002 - 23:06 #13
boris > argumentet til match er en regex - det er bare en kortere måde at oprette den på, men man kan da godt dele det op, hvis man vil:

var r = new RegExp(/xxx/);

if(string.match(r)) {
  ..
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester