2009-06-27 51 views

Odpowiedz

53
^\d*[a-zA-Z][a-zA-Z0-9]*$ 

Zasadniczo oznacza to:

  • zero lub więcej Cyfry ASCII;
  • Jeden alfabetyczny znak ASCII;
  • Zero lub więcej znaków alfanumerycznych ASCII.

Wypróbuj kilka testów, a zobaczysz, że przekazuje to alfanumeryczny ciąg ASCII, w którym wymagany jest co najmniej jeden nieliczbowy znak ASCII.

Kluczem do tego jest \d* z przodu. Bez tego regex robi się o wiele bardziej niezręczny.

+0

"Jedna litera alfanumeryczna" powinna brzmieć "Jedna litera alfabetu" lub podobna: ta część wyrażenia regularnego nie zawiera cyfr. –

+0

\ d * jest sprytny! –

+0

@ R.Pate: całkiem dobrze. Naprawiony. Dzięki. – cletus

1
^[0-9]*[A-Za-z][0-9A-Za-z]*$ 

to wyrażenie regularne, które zrobi to, o co prosisz. Znak^i $ odpowiadają początkowi i końcowi słowa, aby zapobiec innym postaciom. Możesz zamienić blok [0-9A-z] na \ w, ale wolę bardziej rozbudowaną formę, ponieważ łatwiej jest rozszerzyć o inne znaki, jeśli chcesz.

Dodaj weryfikator wyrażeń regularnych do strony asp.net zgodnie z samouczkiem na temat MSDN: http://msdn.microsoft.com/en-us/library/ms998267.aspx.

+0

może zawierać wszystkie liczby, nie? – akf

+0

przegapił dodatkowy bit o konieczności posiadania co najmniej jednej postaci - zmieniłem ją, aby wymusić co najmniej jedną postać. – Dexter

+0

Jeśli nie przechwytujesz, nie potrzebujesz() z wyjątkiem grupowania, a [] tworzy świetną grupę. A-z to coś więcej niż tylko litery. Prawdopodobnie miałeś na myśli [0-9A-Za-z] * [A-Za-z] [0-9A-Za-z] * –

1
^\w*[\p{L}]\w*$ 

To nie jest takie trudne. Wyrażenie regularne brzmi: dopasuj linię zaczynającą się od dowolnej liczby znaków słownych (liter, cyfr, znaków interpunkcyjnych (których możesz nie chcieć)), która zawiera jedną literę (to jest część [\p{L}] w środku), po której następuje dowolna liczba znaków Znów słowo.

Jeśli chcesz wykluczyć interpunkcji, musisz się mocniejszy wyraz:

^[\p{L}\p{N}]*[\p{L}][\p{L}\p{N}]*$ 

A jeśli nie dbają o Unicode można użyć nudne wyrażenie:

^[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*$ 
+1

Potrzebujesz^i $ swap. –

+0

@R. Pate: Dzięki. Nie byłby to kod, gdyby nie miał błędów. – Welbog

4
^[\p{L}\p{N}]*\p{L}[\p{L}\p{N}]*$ 

Objaśnienie:

  • [\p{L}\p{N}]* zero lub więcej liter Unicode lub numery
  • \p{L} mecze jedna litera
  • [\p{L}\p{N}]* dopasowuje zero lub więcej liter Unicode lub numerów
  • ^ i $ kotwiące ciąg, upewniając się, że wyrażenie regularne pasuje do cały ciąg. Możesz je ominąć, w zależności od tego, którą funkcję dopasowywania wyrażenia regularnego wywołasz.

Wynik: możesz mieć dowolny ciąg alfanumeryczny, chyba że gdzieś tam będzie litera.

\p{L} jest podobny do [A-Za-z], z tym że zawiera wszystkie litery ze wszystkich alfabetów, z akcentami lub znakami diakrytycznymi lub bez nich. Jest znacznie bardziej inkluzywny, używając większego zestawu znaków Unicode. Jeśli nie chcesz tego substytutu elastyczności [A-Za-z]. Podobna uwaga odnosi się do \p{N}, którą można zastąpić przez [0-9], jeśli chcesz zachować prostotę. Więcej informacji można znaleźć w MSDN page on character classes.

Im mniej fantazyjne wersja non-Unicode byłoby

^[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*$ 
+4

\ p {N} pasowałoby do numerów Unicode, takich jak ① ②. Dla niektórych może to być zaskakujące: –

+3

i \ p {L} pasowałyby również do chińskich liter. przed użyciem .. –

+0

Włączenie pierwszej części, [\ p {L} \ p {N}] *, do \ p {N} * upraszcza objaśnienie i zapobiega śledzeniu wstecznemu –

0
^[0-9]*[a-zA-Z][a-zA-Z0-9]*$ 

Może być

  • dowolną liczbę zakończył się charakterem,
  • lub wyrazem alfanumeryczny rozpoczął charakteru
  • lub wyrażenie alfanumeryczne rozpoczynające się od cyfry, po którym następuje znak i koniec ed z podwyrażenie alfanumerycznym
+0

Czy to nie to samo, co w górnej części Odpowiedź? Po prostu \ d zastąpione przez [0-9]. –

+0

No tak, nie widziałem, że w momencie opublikowania – eKek0

18

Większość odpowiedzi na to pytanie są poprawne, ale jest alternatywa, że ​​(w niektórych przypadkach) oferuje większą elastyczność, jeśli chcesz zmienić reguły później:

^(?=.*[a-zA-Z].*)([a-zA-Z0-9]+)$ 

Spowoduje to dopasowanie dowolnej sekwencji znaków alfanumerycznych, ale tylko wtedy, gdy pierwsza grupa również dopasuje całą sekwencję. Jest to mało znana sztuczka w wyrażeniach regularnych, która umożliwia obsługę bardzo trudnych problemów z weryfikacją.

Załóżmy na przykład, że musisz dodać kolejne ograniczenie: ciąg powinien zawierać od 6 do 12 znaków. Przedstawione tutaj oczywiste rozwiązania nie będą działały, ale przy użyciu metody "przestroga", regex staje się po prostu:

^(?=.*[a-zA-Z].*)([a-zA-Z0-9]{6,12})$ 
+0

Jaki cel ma drugi. * mają? –

+0

Brak :-) Może być bezpiecznie anulowane . –

+0

Wiem, że to bardzo stary post, ale to zaoszczędziło mi dzisiaj wiele czasu i kłopotów. UWAGA: w drugim wzorze drugi * IS jest wymagany, jeśli chcesz go poprawnie wymusić. Dzięki jeszcze raz. –

Powiązane problemy