Wyrażenia Regularne

Witam. Mam problem ze zrobieniem dwóch wyrażeń regularnych:

  • dozwolone: małe i duże litery, cyfry, kropki, kreski, podkreślenia

  • wymagane: jedna duża litera, jedna mała litera, cyfra lub znak specjalny

Z pierwszym zrobiłem takie coś: [a-zA-Z0-9._-] jednak walidator pokazuje że jest błąd

Przy drugim skleciłem coś takiego: [A-Z]{1,}[a-z]{1,}([a-z]{1,}|/!/@/#/$/%/^/&/*)

Jednak oba nie działają, bo zapewne są źle zrobione. Czy mógłby ktoś je poprawić?

Załącz całą regułą walidatora, będzie łatwiej potestować.

Jeśli używasz tych wyrażeń dokładnie tak jak napisałeś to pierwsze zezwala na dokładnie jeden znak z podanego zakresu.

W drugim chyba pomyliłeś / z \.

Moja reguła do haseł:




array('newPassword', 'match', 'pattern' => '/^.*(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/', 'message'  => Yii::t('UsrModule.usr', 'New password must contain at least one lower and upper case character and a digit.')),



Wymaga przynajmniej jednej cyfry, małej i dużej litery.

Znak zapytania i = w bloku (?=.*\d) oznacza "wyszukiwanie do przodu" i wymaga ciągu dowolnych znaków po których jest jedna cyfra.

Dobra pierwsze udało mi się zrobić. Ale jak najprościej zrobić drugie? Próbowałem


/^[a-z]{1,}[A-Z]{1,}[0-9]{1,}$/

ale to wymusza odpowiednią kolejność? Jak zmienić to w zestaw, żeby nie musiało być w takiej kolejności?

Tak jak napisałem wcześniej, trzeba używać tzw. "positive lookahead" czyli składni ze znakiem zapytania. Więcej w manualu:

Każdą grupę dajesz w (?=WYRAZENIE), czyli:




/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])$/



Szukasz dowolnej z grup zawierających dowolne znaki za którymi jest ten z podanego zakresu.

Niestety nie działa: http://regexp.pl/main/show/219288




/^.*(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/



To działa, sprawdziłem.