2015-05-30 16 views
5

O ile wiem {} nawiasy klamrowe są wykorzystywane w celu ograniczenia znaków w wyrażeniu regularnym jak {3,12}, by dopasować długość znaków od 3 do 12.jak ograniczyć znaki między zakresem wykorzystujące wyrażenia regularnego

Próbuję sprawdzanie nazwy użytkownika, która może zawierać okres . lub _ albo jedną, ale nie obie, nie ma znaczenia umieszczenie. W tym przypadku regex działa bardzo dobrze.

(^[a-z0-9]+$)|(^[a-z0-9]*[\.\_][a-z0-9]*$) 

Ale też trzeba ograniczyć długość ciągu od 3 do 12 lat, próbowałem umieścić {3,12} w regex, ale to nie działa.

((^[a-z0-9]+$)|(^[a-z0-9]*[\.\_][a-z0-9]*$)){3,12} 

Patrz przykład: https://regex101.com/r/kN3aO1/1

+0

Wiele dzieje się z wybranym wyrażeniem '^ (? =. {3,12} $) [a-z0-9] + (?: [._] [a-z0-9] +)? $ "oprócz pozostałych w stosunku do długości przedziału czasu, czy widzisz inne subtelne różnice w stosunku do oryginalnego wyrażenia regularnego? – sln

+0

Użyłem '|' do odróżnienia ciągu znaków od nieokresowego lub podkreślenia i vice versa innej strony, jakkolwiek myślę, że ekspresja hwnd jest lepsza niż kopalnie, ponieważ nie używał lub –

Odpowiedz

3

jako hwnd sugeruje, prostszym rozwiązaniem byłoby:

^(?=.{3,12}$)[a-z0-9]+(?:[._][a-z0-9]+)?$ 

Stare rozwiązanie, które jest dość złożone i zwinięty, pozostaje tutaj odniesienie , ale zamiast tego użyj powyższego.

^(?!(?:.{13,}|.{1,2})$)(?:([a-z0-9]+)|([a-z0-9]*[\.\_][a-z0-9]*))$ 

Możesz dodać wyprzedzeniem dla tego.

Demo on regex101

+2

prawdopodobnie zrobiłbym '^ (? =. { 3,12} $) [a-z0-9] + (?: [._] [a-z0-9] +)? $ 'Zamiast tego. – hwnd

+0

@ hwnd yeah ..........właśnie użyłem regex OP's – vks

+1

Działa jak urok! Dzięki –

0

Chciałbym to zrobić w trzech krokach.

  1. Sprawdź, czy łańcuch zawiera dowolne "/".
  2. Sprawdź, czy łańcuch ma w sobie dowolne "_".
  3. Sprawdź, czy długość łańcucha wynosi między 3 a 12.

W Perl:

if ((($name =~ /_/) && ($name =~ /\./)) || 
    (length($name) < 3) || 
    (length($name) > 12)) 
{ 
    # Handle invalid username 
} 

Jeśli chcesz się upewnić, że nazwa użytkownika zawiera tylko jeden kropkę lub podkreślenia możesz je policzyć. Ponownie, w Perlu:

my $dcnt = $name =~ tr /././; 
my $ucnt = $name =~ tr /_/_/; 

if (($dcnt > 0 && $ucnt > 0) || 
    ($dcnt > 1)   || 
    ($ucnt > 1)   || 
    (length($name) < 3) || 
    (length($name) > 12)) 
{ 
    # Handle invalid username 
} 

Dlaczego nie jedno wyrażenie regularne potwora, które robi wszystko na raz? Cóż, ze względu na łatwość konserwacji. Jeśli Ty lub ktoś z koleżanek przyjrzy się temu kodowi w ciągu roku, po zmianie wymagań, to podejście ułatwi aktualizację kodu.

Należy również zauważyć, że {3,12} nie mówi nic o długościach. Pozwala to na dopasowanie poprzedniego wzoru do trzech do dwunastu razy.

Powiązane problemy