Potrzebuję wyrażenia regularnego, aby to sprawdzić
hasło musi mieć osiem znaków, w tym jedną wielką literę, jeden znak specjalny i znaki alfanumeryczne.
A oto moje wyrażenie walidacyjne, które obejmuje osiem znaków, w tym jedną wielką literę, jedną małą literę i jedną cyfrę lub znak specjalny.
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"
Jak mogę napisać hasło, które musi składać się z ośmiu znaków, w tym jednej wielkiej litery, jednego znaku specjalnego i znaków alfanumerycznych?
Odpowiedzi:
Wyrażenie regularne, którego szukasz, będzie najprawdopodobniej ogromne i koszmar w utrzymaniu, szczególnie dla osób, które nie są zaznajomione z wyrażeniami regularnymi.
Myślę, że łatwiej byłoby rozbić swoje wyrażenie regularne i robić to po kawałku. Może to zająć trochę więcej czasu, ale jestem prawie pewien, że utrzymanie go i debugowanie byłoby łatwiejsze. Umożliwiłoby to również przekazywanie użytkownikom bardziej ukierunkowanych komunikatów o błędach (innych niż tylko
Invalid Password
), co powinno poprawić komfort użytkowania.Z tego, co widzę, dość biegle posługujesz się wyrażeniami regularnymi, więc przypuszczam, że podawanie wyrażeń regularnych do robienia tego, czego potrzebujesz, byłoby daremne.
Widząc twój komentarz, tak bym się do tego zabrał:
Musi mieć osiem znaków długości: nie potrzebujesz do tego wyrażenia regularnego. Korzystanie z
.Length
nieruchomości powinno wystarczyć.W tym jedna wielka litera: możesz użyć
[A-Z]+
wyrażenia regularnego. Jeśli ciąg zawiera co najmniej jedną wielką literę, to wyrażenie regularne da wyniktrue
.Jeden znak specjalny: możesz użyć,
\W
który będzie pasował do dowolnego znaku, który nie jest literą ani cyfrą, albo możesz użyć czegoś takiego,[!@#]
aby określić niestandardową listę znaków specjalnych. Zauważ jednak, że znaki takie jak$
,^
,(
i)
są znaki specjalne w języku wyrażeń regularnych, więc muszą być uciekł tak:\$
. Krótko mówiąc, możesz użyć\W
.Znaki alfanumeryczne: użycie znaku
\w+
powinno odpowiadać dowolnej literze i cyfrze oraz podkreśleniu.Zapoznaj się z tym samouczkiem, aby uzyskać więcej informacji.
źródło
W jednej linii:
Edycja 2019-05-28:
Musisz dopasować cały ciąg wejściowy. Możesz więc ująć wyrażenie regularne między
^
i,$
aby zapobiec przypadkowemu przyjęciu częściowych dopasowań jako pasujących do całego wejścia:Źródła:
Wyrażenie dopasowania hasła
Sprawdzanie siły hasła za pomocą wyrażeń regularnych
źródło
^
a$
. Spróbuj tego:^((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})$
Tak wiele odpowiedzi ... wszystkie złe!
Wyrażenia regularne nie mają operatora AND, więc dość trudno jest napisać wyrażenie regularne pasujące do prawidłowych haseł, gdy ważność jest definiowana przez coś ORAZ coś innego ORAZ coś innego ...
Ale, wyrażenia regularne zrobić mieć operator OR, więc wystarczy zastosować twierdzenie DeMorgan, a napisać regex, który pasuje nieprawidłowych haseł.
wszystko, co ma mniej niż 8 znaków LUB cokolwiek bez cyfr LUB cokolwiek bez wielkich liter LUB cokolwiek bez znaków specjalnych
Więc:
Jeśli cokolwiek pasuje do tego, jest to nieprawidłowe hasło.
źródło
|.{9,}
. +1 za koncepcjęOdpowiedź brzmi: nie używaj wyrażenia regularnego. To jest zestawy i liczenie.
Wyrażenia regularne dotyczą porządku.
W swoim życiu jako programista będziesz proszony o zrobienie wielu rzeczy, które nie mają sensu. Naucz się kopać poziom głębiej. Dowiedz się, kiedy pytanie jest błędne.
Pytanie (jeśli wspomniało o wyrażeniach regularnych) jest błędne.
Pseudokod (ostatnio przełączałem się między zbyt wieloma językami):
Założę się, że przeczytałeś i zrozumiałeś powyższy kod niemal natychmiast. Założę się, że zajęło ci to dużo więcej czasu z wyrażeniem regularnym i masz mniejszą pewność, że jest poprawne. Rozszerzanie wyrażenia regularnego jest ryzykowne. Rozszerzyłem bezpośrednio powyższe, znacznie mniej.
Zwróć również uwagę, że pytanie jest sformułowane nieprecyzyjnie. Czy zestaw znaków to ASCII czy Unicode, czy ?? Po przeczytaniu pytania domyślam się, że zakłada się co najmniej jedną małą literę. Więc myślę, że zakładaną ostatnią zasadą powinno być:
(Zmiana kapeluszy na skoncentrowaną na bezpieczeństwie, jest to naprawdę irytująca / nieprzydatna zasada).
Wiedza, kiedy pytanie jest błędne, jest znacznie ważniejsza niż mądre odpowiedzi. Sprytna odpowiedź na złe pytanie jest prawie zawsze błędna.
źródło
Jako przykład, jak można to zrobić za pomocą czytelnego / możliwego do utrzymania wyrażenia regularnego.
W przypadku dłuższych
RegexOptions.IgnorePatternWhitespace
wyrażeń regularnych należy zawsze używać znaków, które pozwolą na użycie białych znaków i komentarzy w wyrażeniu, aby zapewnić lepszą czytelność.źródło
lookahead assertion
wzorca „i” w celu pokrycia całego ograniczenia w ramach jednego wyrażenia regularnego. Działa dla większej liczby ograniczeń i można je łatwo wygenerować, jeśli niektóre ograniczenia powinny być włączone / wyłączone przez konfigurację.Jeśli potrzebujesz tylko jednej dużej litery i znaku specjalnego, to powinno działać:
źródło
AAaaaaaaa#
nie jest OK zgodnie z tym wyrażeniemWyrażenie regularne pan szukał to:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*\[\]"\';:_\-<>\., =\+\/\\]).{8,}$/u
.Przykład i test: http://regexr.com/3fhr4
źródło
.
zanim{8,}
się[^\s]
.To pytanie zaczyna być wirusowe i pojawiło się wiele ciekawych sugestii.
Tak, pisanie odręczne jest trudne. Więc łatwiejszym rozwiązaniem jest użycie szablonu. Chociaż wynikowe wyrażenie regularne może nie być najbardziej optymalne, łatwiej będzie je utrzymać i / lub zmienić, a użytkownik będzie miał lepszą kontrolę nad wynikiem. Możliwe, że coś przeoczyłem, więc jakakolwiek konstruktywna krytyka będzie pomocna.
Te linki mogą być interesujące: dopasuj co najmniej 2 cyfry 2 litery w dowolnej kolejności w ciągu , język wyrażeń regularnych , grupy przechwytywania
Używam tego szablonu
(?=(?:.*?({type})){({count})})
na podstawie wszystkich wyrażeń regularnych, które widziałem w SO. Następnym krokiem jest zastąpienie potrzebnego wzoru (number
,special character
...) i dodanie konfiguracji długości.Stworzyłem małą klasę do tworzenia wyrażenia regularnego PasswordRegexGenerator.cs Przykład:
źródło
Możesz użyć poniższej klasy do walidacji:
gdzie 6 i 20 to minimalna i maksymalna długość hasła.
źródło
(?>{8,})
(?<=...)
(?<=\p{Lu}.*)
(?<=\W.*)
(?<=\w.*)
Podsumował:
(?>.{8,})(?<=\p{Lu}.*)(?<=\W.*)(?<=\w.*)
źródło
Najlepiej nie używać wyrażeń regularnych do wszystkiego. Te wymagania są bardzo lekkie. W przypadku operacji na łańcuchach opartych na procesorach w celu sprawdzenia kryteriów / walidacji jest znacznie tańsza i szybsza niż regex!
źródło
źródło
źródło