Muszę sprawdzić, czy ciąg zawiera od 0 do 3 spacji i 16 cyfr. Jak mogę to zrobić ? Wszystko, co wymyślę, to tylko sprawdzenie sumy
^[0-9- ]{16,19}$
Odpowiedzi:
2 dla odpowiedzi № 1Powinieneś użyć
^(?=(?:[^ ]* ){0,3}[^ ]*$)(?=(?:[^0-9]*[0-9]){16}[^0-9]*$)[0-9- ]+$
Zobacz Prezentacja regex na regex101.com.
Alternatywnie, pierwsza pozytywna kontrola wyprzedzenia spacji może być zastąpiona negatywną z odwrotną logiką:
^(?!(?:[^ ]* ){4})(?=(?:[^0-9]*[0-9]){16}[^0-9]*$)[0-9- ]+$
Widzieć kolejne demo
Oba wyrażenia regularne są napisane przy pomocy zasada kontrastu pamiętaj, aby szybciej nie powtarzać wyrażenia regularnego, jeśli wzorzec wyprzedzający nie pasuje.
Detale:
^
- początek łańcucha(?!(?:[^ ]* ){4})
- negatywny wynik z wyprzedzeniem nie powiodący się, jeśli po prawej stronie bieżącej lokalizacji znajdują się 4 sekwencje:[^ ]*
- 0+ znaków innych niż spacja
(?=(?:[^0-9]*[0-9]){16}[^0-9]*$)
- pozytywny wynik wyprzedzający wymagający, aby cały ciąg znaków zawierał 16 sekwencji zerowych cyfr ([^0-9]*
), a następnie 1 cyfra, a następnie 0+ znaki inne niż cyfra do końca ciągu[0-9- ]+
- pasuje do ponad 1 znaków, które są cyframi,-
lub spacje$
- koniec ciągu.
2 dla odpowiedzi nr 2
Możesz użyć tego wyrażenia regularnego na podstawie lookaheads:
^[0-9](?!(?:[0-9]* ){4})(?=(?: *[0-9]){15}$)[0-9- ]+[0-9]$
^[0-9]
i[0-9]$
zapewnia, że mamy tylko cyfry na początku i na końcu.(?!(?:[0-9]* ){4})
jest ujemny, aby uniemożliwić 4 spacje (umożliwiając w ten sposób od 0 do 3 białych spacji)(?=(?: *[0-9]){16} *$)
ma pozytywny wpływ na przyszłość, umożliwiając wprowadzenie dokładnie 16 cyfr na wejściu w otoczeniu opcjonalnych spacji.