Witam,
Czy może mi ktoś wyjaśnić zachowanie Regex-a
Regex regex = new Regex("^[0-9]{1,8}$");
Console.WriteLine(regex.IsMatch("456789", 1) ? "true" : "false");
Pozdrawiam,
mr-owl
Witam,
Czy może mi ktoś wyjaśnić zachowanie Regex-a
Regex regex = new Regex("^[0-9]{1,8}$");
Console.WriteLine(regex.IsMatch("456789", 1) ? "true" : "false");
Pozdrawiam,
mr-owl
To wyrażenie regularne jest prawdziwe dla ciągów znaków składających się wyłącznie z od jednej do ośmiu cyfr.
Rozbrajając wyrażenie na części mamy:
^
wymusza aby sprawdzany ciąg znaków zaczynał się od następnego symbolu (w naszym przypadku cyfry).[0-9]
dopasowuje pojedynczy znak od 0
do 9
(czyli 0
lub 1
lub 2
lub 3
etc.).{1,8}
oznacza że poprzednie wyrażenie (czyli nasze [0-9]
) musi być powtórzone od jednego do ośmiu razy (przy czym nie musi być to wcale ta sama cyfra),$
wymusza aby sprawdzany ciąg znaków kończył się poprzednim symbolem (w naszym przypadku cyfrą); innymi słowy: po ośmiu cyfrach nie może znajdować się nic więcej.Rzuć okiem np. na regex101 albo pierwszy-lepszy poradnik odnośnie wyrażeń regularnych, ponieważ to akurat są podstawowe konstrukcje :-)
Console.WriteLine(regex.IsMatch("456789", 1) ? "true" : "false");
Argument 1
oznacza, że pod uwagę brany jest ciąg poczynając od pozycji nr 1 (czyli "5", bo stringi są indeksowane od zera).
To się kłóci ze znacznikiem ^
. Silnik wprawdzie pomija "4" przy przymierzaniu stringa do wyrażenia, ale i tak "wie", że nie jest na początku stringa, i dlatego zwraca false. Zamiast tego trzeba użyć \G
- vide https://stackoverflow.com/questions/5884922/regex-match-startat-and-start-of-string
Nawiasem mówiąc, powinno wystarczyć samo:
Console.WriteLine(regex.IsMatch("456789", 1));
Nie musisz ręcznie konwertować booleana do stringa.