Avatar billede jhansen31 Nybegynder
10. marts 2006 - 08:34 Der er 11 kommentarer og
1 løsning

Regular expression

Nu har jeg hevet mig selv i håret, en halv dag for at lave et regular expression til validering af password, og er nået frem til følgende:
ValidationExpression="(?!^[^a-zA-Z-09]+$)(?!=.+\d)(?!^[a-zA-Z]+$)^([a-zA-Z0-9\W]{8,10})$"

Jeg vil gerne have at passwordet SKAL indeholde bogstaver, MINDST ét tal og MINDST ét speciel tegn(!, @, $, osv).

Den jeg har her skal indeholde bogstaver samt ét tal ELLER et speciel tegn.

Jeg har været inde på diverse site's, så kun en løsning kan bruges.
Avatar billede soreno Praktikant
10. marts 2006 - 09:14 #1
Hvorfor ikke bare lave en metode til at validere passwordet ?

F.eks.

    public static Boolean containsLowerChars(String pass) {
      foreach (Char c in pass) {
        if (Char.IsLower(c)) {
          return true;
        }
      }
      return false;
    }

    public static Boolean containsUpperChars(String pass) {
      foreach (Char c in pass) {
        if (Char.IsUpper(c)) {
          return true;
        }
      }
      return false;
    }

    public static Boolean containsDigits(String pass) {
      foreach (Char c in pass) {
        if (Char.IsDigit(c)) {
          return true;
        }
      }
      return false;
    }

    public static Boolean containsSpecialChars(String pass) {
      char[] specialChars = { '!', '"' };
      foreach (Char c in pass) {
        if (Char.IsPunctuation(c)) {
          return true;
        }
      }
      return false;
    }

    public static Boolean hasMinLength(String pass) {
      int minLengthInclusive = 8;
      return pass.Length >= minLengthInclusive;
    }

    public static Boolean doesNotExceedMaxLength(String pass) {
      int maxLengthInclusive = 12;
      return pass.Length <= maxLengthInclusive;
    }

    public static Boolean validPass(String pass) {
      Boolean retVal = false;
      if (containsLowerChars(pass) && containsUpperChars(pass) &&
          containsDigits(pass) && containsSpecialChars(pass) &&
          hasMinLength(pass) && doesNotExceedMaxLength(pass)) {
        retVal = true;
      }

      return retVal;
    }

    static void Main(string[] args) {
      String[] tests = {"abekat", "abeKAT", "abeKat4", "abeKAD4!", "aB2&", "abeKATabeKAT33@"};
      foreach (String str in tests) {
        Console.WriteLine("{0} = {1}", str, validPass(str));
      }
      Console.ReadKey();
    }

Output:
abekat = False
abeKAT = False
abeKat4 = False
abeKAD4! = True
aB2& = False
abeKATabeKAT33@ = False


Det tog 10 minutter og er meget fleksibelt i forhold til modifiability.
Avatar billede jhansen31 Nybegynder
10. marts 2006 - 09:36 #2
Det har jeg også overvejet. Men nu syntes jeg det kunne være sjovt at lave som et Expression.
Avatar billede the_party_dog Nybegynder
10. marts 2006 - 11:11 #3
Vil det sige at den du har fremstillet kører fint, hvis der er bogstaver + 1 tal ELLER bogstaver + et spciel tegn?
Avatar billede the_party_dog Nybegynder
10. marts 2006 - 12:27 #4
^(\D+\d+\W+|\D+\W+\d+|\d+\D+\W+|\d+\W+\D+|\W+\D+\d+|\W+\d+\D+)$

Denne burde klare opgaven tilfredsstillende...
Avatar billede the_party_dog Nybegynder
10. marts 2006 - 12:28 #5
Og alligevel ikke kan jeg så se på det hele...

Tilbage til tænkebordet....
Avatar billede the_party_dog Nybegynder
10. marts 2006 - 12:37 #6
Hvis du vil lade dem designer ALLE mulige passwords, får du en lang expression, hvis du vil tage højde for alt.

Den her kan dække de mest syge, men du kan ikke sætte ^ og $ tegnene ind. Tænk på en bruger med dette password: "Teh33kfe#444k". Det vil du ikke kunne dække ind med udtryk, andet du lister ALLE muligheder som der kan være i et password, så er du måske bedre tjent med soreno's mulighed.

(\D+\d+\W+|\D+\W+\d+|\d+\D+\W+|\d+\W+\D+|\W+\D+\d+|\W+\d+\D+) <- Denne kan tage det nævnte password
Avatar billede the_party_dog Nybegynder
11. marts 2006 - 00:18 #7
(^\D+$)(^\d+$)(^\W+$)

Gider du prøve denne? Den kan måske klare det hele, har ikke haft mulighed for at teste den selv.... Kom lige på den....
Avatar billede the_party_dog Nybegynder
13. marts 2006 - 07:39 #8
Godmorgen....

Hvorfor er det lige at vi ikke har prøvet det mest "simple"? Du laver et array med de ting de skal indeholde. Så loop'er du igennem dem sammen med et regex objekt. Så behøver du ikke lave et regex som kan håndtere alt. Du laver bare nogle små bider som kan håndtere de ting som du vil have.

string[] TestCriteria = {@".*\D+.*",@".*\d+.*",@".*\W+.*"};
            bool Result = false;

            Regex regTester;

            foreach(string S in TestCriteria)
            {
                regTester = new Regex(S,RegexOptions.Singleline);

                Result = regTester.IsMatch(textBox1.Text);

                if(!Result)
                {
                    break;
                }
            }
           
            MessageBox.Show(Result.ToString());
Avatar billede soreno Praktikant
13. marts 2006 - 08:52 #9
Det er samme koncept som min reglbaserede løsning.

Reg Exp løsningen er mest kompakt.
Min er mest fleksibel.

De fleste passwords har desuden en min og max længde, så det skal der nok også testes på.
Avatar billede the_party_dog Nybegynder
13. marts 2006 - 08:56 #10
soreno> Jeg vil helt klart give dig ret, din løsning er klart den bedste. Jeg havde valgt din løsning hvis jeg havde siddet fast omkring denne opgave.

Regex er god til mange ting, som er meget "faste"; Mønstre af tegn. Passwords er meget mere flyske og derfor svære at matche med en regex...
Avatar billede jhansen31 Nybegynder
21. marts 2006 - 10:12 #11
Jeg har valgt at bruge denne her:
ValidationExpression="^(?!^[0-9]+$)(?!^[^a-zA-Z-09]+$)(?!^[a-zA-Z]+$)^([a-zA-Z0-9\W]{8,10})$"

Hvis i føler kan i bare smide et svar..
Avatar billede the_party_dog Nybegynder
21. marts 2006 - 10:29 #12
jhansen31> Hvis vores løsning ikke bliver brugt, skal vi heller ikke have points. :-) Held og lykke med det.
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