Próbuję utworzyć test Regex w JavaScript, który przetestuje ciąg zawierający dowolny z następujących znaków:
!$%^&*()_+|~-=`{}[]:";'<>?,./
Więcej informacji, jeśli jesteś zainteresowany :)
To całkiem fajna aplikacja do zmiany hasła, nad którą pracuję. Jeśli jesteś zainteresowany, oto reszta kodu.
Mam tabelę, która zawiera listę wymagań dotyczących haseł i gdy użytkownicy końcowi wpisują nowe hasło, przetestuje tablicę Regexes i umieści znacznik wyboru w odpowiednim wierszu tabeli, jeśli ... wyszedł :) Muszę tylko dodać to zamiast czwartej pozycji w validation
tablicy.
var validate = function(password){
valid = true;
var validation = [
RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password),
RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password),
!RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password),
!RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
]
$.each(validation, function(i){
if(this)
$('.form table tr').eq(i+1).attr('class', 'check');
else{
$('.form table tr').eq(i+1).attr('class', '');
valid = false
}
});
return(valid);
}
Tak, istnieje również odpowiednia weryfikacja po stronie serwera!
javascript
jquery
regex
pixelbobby
źródło
źródło
.addClass("check")
i.removeClass("check")
? A widzenieif (someBoolean == true)
w kodzie zawsze mnie kuli. Po prostu zróbif (someBoolean)
. Albo, jeszcze lepiej, po prostu zrób$(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
.Odpowiedzi:
Wyrażenie regularne do tego jest naprawdę proste. Po prostu użyj klasy postaci. Łącznik jest znakiem specjalnym w klasach postaci, więc musi być pierwszy:
/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/
Musisz także zmienić znaczenie innych metaznaków wyrażeń regularnych.
Edycja: łącznik jest specjalny, ponieważ może być używany do reprezentowania zakresu znaków. Tę samą klasę znaków można uprościć za pomocą zakresów do tego:
/[$-/:-?{-~!"^_`\[\]]/
Istnieją trzy zakresy. „$” na „/”, „:” na „?” i „{” na „~”. ostatni ciąg znaków nie może być reprezentowany prościej za pomocą zakresu:! "^ _` [].
Użyj tabeli ACSII, aby znaleźć zakresy dla klas znaków.
źródło
\Q
i\E
nie działają w silniku JS RegExp :(/^\Q.\E$/.test('Q+E'); // true
Najprostszy i najkrótszy sposób, aby to osiągnąć:
Wyjaśnienie
[^...]
Dopasuj pojedynczy znak, którego nie ma na poniższej liście\p{L}
=> pasuje do dowolnego rodzaju liter z dowolnego języka\d
=> dopasowuje cyfrę od zera do dziewięciu\s
=> pasuje do dowolnego niewidzialnego znaku@#
=>@
i#
znakiNie zapomnij przekazać
u
flagi (unicode).źródło
^
jest potrzebny, gdy używamy\w
i\s
małymi literami.w
lub na zewnątrzs
, a ponieważ te dwie tak naprawdę nie przecinają się, po prostu przepuszczają wszystkie postacie? (W ten sposób niczego nie filtruje)/[\W\S]/
), przepuszcza wszystko. Bardziej dokładne przedstawienie tego, do czego według mnie dążył Amir[^\w\s]
. W pierwszym przypadku wyrażenie regularne mówi „dopasuj wszystko, co nie jest alfanumeryczne LUB co nie jest białą spacją”, co, jak wspomniałeś, pozwala przejść przez wszystko, ponieważ znaki alfanumeryczne nie są białymi spacjami i odwrotnie. Ten ostatni mówi „dopasuj wszystko, co nie jest alfanumeryczne ORAZ nie jest białymi znakami”. Oczywiście obowiązują wyjątki, jeśli znaki akcentowane (jakÀ
) są dopasowywane przez[^\w\s]
.Odpowiedź
Wyjaśnienie
Tworzy to klasę znaków, usuwając znaki słowne, znaki spacji i dodając z powrotem znak podkreślenia (ponieważ podkreślenie jest znakiem „słowa”). Pozostały tylko znaki specjalne. Wielkie litery reprezentują negację ich małych odpowiedników.
\W
wybierze wszystkie znaki inne niż "słowo" równoważne z[^a-zA-Z0-9_]
\S
wybierze wszystkie znaki inne niż "białe znaki", które są równoważne[ \t\n\r\f\v]
_
wybierze "_" ponieważ negujemy to gdy używamy\W
i musimy go dodać ponownieźródło
Prostym sposobem osiągnięcia tego jest zbiór ujemny [^ \ w \ s]. To zasadniczo łapie:
Z jakiegoś powodu [\ W \ S] nie działa w ten sam sposób, nie filtruje. Komentarz Zaela do jednej z odpowiedzi dostarcza pewnego wyjaśnienia.
źródło
/[^\w\s]/.test('é') # true
,/[^\w\s]/.test('_') # false
.// The string must contain at least one special character, escaping reserved RegEx characters to avoid conflict const hasSpecial = password => { const specialReg = new RegExp( '^(?=.*[!@#$%^&*"\\[\\]\\{\\}<>/\\(\\)=\\\\\\-_´+`~\\:;,\\.€\\|])', ); return specialReg.test(password); };
źródło
RegExp
konstruktora, gdy możesz po prostu użyć literału regex. Dużo mniej pracy uciekającej (z których większość i tak jest niepotrzebna), a także bardziej wydajna.Zastąp wszystkie ostatnie litery z dowolnego języka w „A”, a jeśli chcesz na przykład wszystkie cyfry na 0:
return str.replace(/[^\s!-@[-`{-~]/g, "A").replace(/\d/g, "0");
źródło