2012-12-19 15 views
26

Próbuję sprawdzić poprawność ciągu, który powinien zawierać tylko litery i znaki specjalne &-._. Do tego próbowałem z wyrażeniem regularnym.Dopasowywanie znaków specjalnych i liter w regex

var pattern = /[a-zA-Z0-9&_\.-]/ 
var qry = 'abc&*'; 
if(qry.match(pattern)) { 
    alert('valid'); 
} 
else{ 
    alert('invalid'); 
} 

Podczas korzystania z powyższego kodu obowiązuje ciąg abc&*. Ale moim wymaganiem jest pokazanie tego nieważnego. Oznacza to, że gdy pojawia się znak inny niż litera, liczba lub znaki specjalne &-._, ciąg powinien zostać uznany za nieważny. Jak mogę to zrobić za pomocą wyrażenia regularnego?

+4

Kluczem jest użycie '^' na początku i '+' $ na końcu, jako odpowiedzi poniżej wyjaśniłem. '/^[a-zA-Z0-9 & _ \ .-] + $ /'. Wskazuję to na wypadek, gdybyś przegapił tę subtelną różnicę. –

Odpowiedz

42

dodać je do dozwolonych znaków, ale musisz uciec niektóre z nich, takie jak: -]/\

var pattern = /^[[email protected]#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]*$/ 

ten sposób można usunąć indywidualny charakter, który chcesz zabronić .

Również chcesz to początek i koniec placemarkers smyczkowych^i $

Aktualizacja:

Jak elclanrs rozumie (i reszta z nas nie zrobił, początkowo), przy czym tylko znaków specjalnych, którzy muszą być dopuszczone w strukturze są & -._

/^[\w&.\-]+$/ 

[\ j] jest taki sam jak [-zA-z0-9_]

Chociaż myślnik nie wymaga ucieczki, gdy znajduje się na początku lub końcu listy, wolę zrobić to na wypadek dodania innych znaków. Dodatkowo + oznacza, że ​​potrzebujesz co najmniej jednego z wymienionych znaków.Jeśli zerowy jest ok (czyli pustą wartość), a następnie zastąpić je * Zamiast:

/^[\w&.\-]*$/ 
+1

Sugerowałbym, że każda lista, która pozwala na wszystkie te znaki specjalne, powinna również zezwalać na spacje. – Abacus

+0

Znak plus (+) nie działa z tym wyrażeniem – calbertts

+0

@calbertts, masz na myśli to, gdzie znajduje się na liście znaków w "var pattern ..."? Z jakiego języka korzystasz? JavaScript? –

16

Po co dodawać je do istniejącej klasy postaci?

var pattern = /[a-zA-Z0-9&._-]/ 

Jeśli trzeba sprawdzić, czy ciąg składa się z niczego, ale te znaki trzeba kotwicy wyrażenie, a także:

var pattern = /^[a-zA-Z0-9&._-]+$/ 

Dodana ^ i $ dopasowują początek i koniec ciąg odpowiednio.

Testowanie liter, cyfr lub podkreślenia można zrobić z \w co skraca swój wyraz:

var pattern = /^[\w&.-]+$/ 

Jak wspomniano w komentarzu z Nathanem, jeśli nie używasz wyniki z .match() (Zwraca tablica z tego, co zostało dopasowane), to lepiej użyć RegExp.test() która zwraca prostą logiczną:

if (pattern.test(qry)) { 
    // qry is non-empty and only contains letters, numbers or special characters. 
} 

Update 2

W przypadku błędnego przeczytania pytania, poniższe sprawdzenie sprawdzi, czy wszystkie trzy warunki są spełnione.

if (/[a-zA-Z]/.test(qry) && /[0-9]/.test(qry) && /[&._-]/.test(qry)) { 
    // qry contains at least one letter, one number and one special character 
} 
+3

+1. Warto wspomnieć o użyciu 'test' zamiast' match', ponieważ tak naprawdę nie potrzebujesz znaleźć pasujących elementów. Może to pomóc w wydajności, czytelności i może pomóc pytającemu nauczyć się czegoś nowego. –

+1

Nie ma również ukośnika po 'i'. '/ [a-z]/i /' powinno być '/ [a-z]/i'. –

9

Spróbuj regex:

/^[\w&.-]+$/ 

Również można użyć test.

if (pattern.test(qry)) { 
    // valid 
} 
0

Spróbuj RegEx: Matching specjalnych charecters które wykorzystujemy w ustępach i alfabetów

Javascript : /^[a-zA-Z]+(([\'\,\.\-_ \/)(:][a-zA-Z_ ])?[a-zA-Z_ .]*)*$/.test(str) 

       .test(str) returns boolean value if matched true and not matched false 

      c# : ^[a-zA-Z]+(([\'\,\.\-_ \/)(:][a-zA-Z_ ])?[a-zA-Z_ .]*)*$ 
Powiązane problemy