Oto Twój regex (demo):
^6(?:011\d{12}|5\d{14}|4[4-9]\d{13}|22(?:1(?:2[6-9]|[3-9]\d)|[2-8]\d{2}|9(?:[01]\d|2[0-5]))\d{10})$
trzeba dodawać, że nie będę dokładnie nazwać całkiem lub proste utrzymać. Poleciłbym analizowanie liczby jako liczby całkowitej i używanie języka programowania do przeprowadzania kontroli.
Należy również używać Luhn algorithm aby sprawdzić, czy numer karty kredytowej jest ważne, a jednocześnie można teoretycznie zrobić to z regex, by wiele razy gorzej niż ten to.
Pozwól, że pokażę Ci, jak przybyłem do tego potwora, krok po kroku. Po pierwsze, tutaj jest jak dopasować każdy z tych zakresów:
6011 # matches 6011
65 # matches 65
64[4-9] # matches 644-649
622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))
# matches 622126-622925
Teraz chcesz dopasować resztę cyfr:
6011\d{12} # matches 6011 + 12 digits
65\d{14} # matches 65 + 14 digits
64[4-9]\d{13} # matches 644-649 + 13 digits
622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))\d{10}
# matches 622126-622925 + 10 digits
Teraz można połączyć wszystkie cztery, a dodać początek i koniec linii zakotwicza:
^( # match start of string and open group
6011\d{12}| # matches 6011 + 12 digits
65\d{14}| # matches 65 + 14 digits
64[4-9]\d{13}| # matches 644-649 + 13 digits
622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))\d{10}
# matches 622126-622925 + 10 digits
)$ # close group and match end of string
Produkt końcowy powyżej jest lekko zagęszczony wersja poprzedniego regex, a ja również grupy nie przechwytywania (to co ci ?:
dotyczą).
Czy możesz po prostu użyć normalnego Discover Regex i wykonać kontrolę w bardziej czytelny sposób w następnej linii? –
Każdy powód, dla którego nie użyjesz tylko porównań liczb nieregexowych? – djechlin
@YuriyFaktorovich Niestety cię nie dostałem. Masz na myśli sformatowanie mojego pytania powyżej lub rozwiązanie go w 2 krokach? Jeśli to ostatnie, wolałbym za to jedno wyrażenie regularne. – Ashfame