Regex - prośba o rozjaśnienie sprawy

0

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

2

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 :-)

3
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1