2014-09-24 9 views
14

W .Net4.5 uważam, że wynik

System.Text.RegularExpressions.Regex.IsMatch(
    "00000000000000000000000000000", "^[1-9]|0$") 

jest prawdą.

Wynik, którego oczekuję, jest fałszywy. Nie wiem dlaczego. Możesz mi pomóc?

Aktualizacja: Na początku byłem walidacji wyrażenie regularne ^-?[1-9]\d*|0$ który jest używany, aby dopasować całkowitą znalezione w internecie i uważam, że łańcuch z wieloma 0 pasuje do wyrażenia regularnego.

+3

Regex dopasowuje swój wkład - jest wyjaśnienie po prawej stronie .: http://regex101.com/r/fB9yK0/1 –

+5

_Dlaczego myślałeś, że to będzie fałsz? Jak myślisz, co próbował wypowiedzieć regex? Czy spodziewałeś się, że zachowa się jak '^ ([1-9] | 0) $'? –

+0

@RayToal Myślę, że '^ [1-9] | 0 $' jest równe '^ [0-9] $' zanim poznam odpowiedź. – SubmarineX

Odpowiedz

46

Problemem jest zachowanie wiązania alternatora. Domyślnie (tj. Bez użycia grupowania) wyrażenie zawierające alternator (|) będzie pasowało albo do wartości po lewej stronie alternatora, albo do wartości po prawej stronie.

Więc w swojej wypowiedzi, jesteś dopasowując jeden z tych:

  • ^[1-9]
  • 0$

Rozmowa z metodą IsMatch zwraca true ponieważ drugi z tych dwóch opcji pasuje do ciągu znaków 00000000000000000000000000000.

Aby ograniczyć alternator wiązanie do określonej części swojej wypowiedzi, trzeba grupy za pomocą nawiasów, co następuje:

^([1-9]|0)$ 

Wyrażając to wszystko razem, ścisłe wyrażenie do sprawdzania poprawności liczb całkowitych, zabronienie zer i ujemne zera, może wyglądać następująco:

^(-?[1-9][0-9]*|0)$ 
+2

Aby rozwinąć, musisz dodać nawiasy '()' wokół części, które chcesz włączyć: '^ ([1-9] | 0) $' lub po prostu '^ [0-9] $' – Rhumborl

+0

@Rhumborl Tak, naprawdę. Rzeczywisty cel nie był bardzo jasny z tego pytania, ale zaktualizuję odpowiedź, aby odzwierciedlić Twój komentarz. –

+0

istotnie, ja _assume_ to jest to, co jest wymagane – Rhumborl

Powiązane problemy