Чаму гэта не рэгулярны выраз C # працуе?

Я спрабаваў запісаць выраз для праверкі наступнай схемы:

<�Р> лічба [0-9] у 1 раз дакладна
  «Кропка»
  лічбы [0-9] 1-2 разы
  «Кропка»
  лічбы [0-9] 1-3 разы
  «Кропка»
  лічба [0-9] 1-3 разы або «злучок»

Напрыклад гэта юрыдычныя нумары:

1.10.23.5
1.10.23.-

яны не з'яўляюцца:

10.10.23.5
1.254.25.3

Я выкарыстаў RegexBuddy напісаць наступную карціну:

[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-

У RegexBuddy ўсё здаецца дасканалым, але ў маім кодзе я атрымліваю сапраўднае пра незаконныя лікаў (напрыклад, 10.1.1.1)

Я напісаў наступны метад для праверкі гэтага шаблону:

 public static bool IsVaildEc(string ec)
        {
            try
            {
                if (String.IsNullOrEmpty(ec))
                    return false;
                string pattern = @"[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-";
                Regex check = new Regex(pattern);
                return check.IsMatch(ec);
            }
            catch (Exception ex)
            {
                //logger
            }
        }

Што я не так раблю?

4
@KendallFrey: Не в .NET! Гэта рэгулярны выраз будзе таксама адпавядаць ².³.4 .- , паколькі \ d гэта Юнікод.
дададзена аўтар Tim Pietzcker, крыніца
@KendallFrey: Не в .NET! Гэта рэгулярны выраз будзе таксама адпавядаць ².³.4 .- , паколькі \ d гэта Юнікод.
дададзена аўтар Tim Pietzcker, крыніца
@ AnnArbor87 :. Згодна MSDN , </код > гэта сімвал для любога аднаго знака ў рэгулярных выразах. OP хоча літаральна кропку, а . , такім чынам, ён ці яна павінен пазьбегнуць яго ``.
дададзена аўтар O. R. Mapper, крыніца
@ AnnArbor87: паказвае на тое, што <�я> папярэдняя Подвыражение можа з'явіцца нуль або адзін раз. . Гэта значыць, => любы сімвал; <�Код>. => любы знак ці адсутнасць знака наогул.
дададзена аўтар O. R. Mapper, крыніца
@ AnnArbor87 :. Згодна MSDN , </код > гэта сімвал для любога аднаго знака ў рэгулярных выразах. OP хоча літаральна кропку, а . , такім чынам, ён ці яна павінен пазьбегнуць яго ``.
дададзена аўтар O. R. Mapper, крыніца
@Ofir: Некаторыя метады і інструменты, ацэньваюць рэгулярныя выразы няяўна мяркуюць, што рэгулярны выраз азначаюць, у адпаведнасці з уведзенай радком цэлай (мабыць RegexBuddy належыць да гэтай групы), у той час як іншыя (у .NET API вы карыстаецеся) не робіць.
дададзена аўтар O. R. Mapper, крыніца
@Ofir: Некаторыя метады і інструменты, ацэньваюць рэгулярныя выразы няяўна мяркуюць, што рэгулярны выраз азначаюць, у адпаведнасці з уведзенай радком цэлай (мабыць RegexBuddy належыць да гэтай групы), у той час як іншыя (у .NET API вы карыстаецеся) не робіць.
дададзена аўтар O. R. Mapper, крыніца
@Kendall - З MSDN дакументацыі : <�я> » \ д ... эквівалентна \ р {Nd} назваў паведамленняў, якое ўключае ў сябе стандартныя дзесятковых лічбаў 0-9, а таксама дзесятковых лічбаў колькасці іншых набораў сімвалаў ".
дададзена аўтар Equality In Tech, крыніца
@Kendall - З MSDN дакументацыі : <�я> » \ д ... эквівалентна \ р {Nd} назваў паведамленняў, якое ўключае ў сябе стандартныя дзесятковых лічбаў 0-9, а таксама дзесятковых лічбаў колькасці іншых набораў сімвалаў ".
дададзена аўтар Equality In Tech, крыніца
.. Protip 2: Гэта скарочаны варыянт ўсёй рэгулярны выраз: \ d \ \ d {1,2} \ \ d {1,3} \ (\ d {1,3} | -) <./код>
дададзена аўтар Kendall Frey, крыніца
.. Protip 2: Гэта скарочаны варыянт ўсёй рэгулярны выраз: \ d \ \ d {1,2} \ \ d {1,3} \ (\ d {1,3} | -) <./код>
дададзена аўтар Kendall Frey, крыніца
Protip: \ д больш кароткі варыянт [0-9] .
дададзена аўтар Kendall Frey, крыніца
Protip: \ д больш кароткі варыянт [0-9] .
дададзена аўтар Kendall Frey, крыніца
Нумар першы нумар павінен быць 1 лічба дакладна
дададзена аўтар Ofir, крыніца
Нумар першы нумар павінен быць 1 лічба дакладна
дададзена аўтар Ofir, крыніца
Іншае пытанне - чаму RegexBuddy паводзіны адрозніваецца ад паводзінаў Regex? У RegexBuddy мой Паці, здаецца, добра ...
дададзена аўтар Ofir, крыніца
Іншае пытанне - чаму RegexBuddy паводзіны адрозніваецца ад паводзінаў Regex? У RegexBuddy мой Паці, здаецца, добра ...
дададзена аўтар Ofir, крыніца
Дзякуй, хлопцы. Я пачатковец у гэтым свеце - Дзякуй за парады.
дададзена аўтар Ofir, крыніца
Дзякуй, хлопцы. Я пачатковец у гэтым свеце - Дзякуй за парады.
дададзена аўтар Ofir, крыніца
Я не разумею, так што да першай пункту ёсць адна лічба [0-9], але вы кажаце, што 10.X.X.X дзейнічае?
дададзена аўтар AAlferez, крыніца
чаму вы паклалі \ ??, ён павінен быць без яго
дададзена аўтар AAlferez, крыніца
чаму вы паклалі \ ??, ён павінен быць без яго
дададзена аўтар AAlferez, крыніца
Дзякуй, не ведаў, я думаў, што гэта было? "
дададзена аўтар AAlferez, крыніца
Дзякуй, не ведаў, я думаў, што гэта было? "
дададзена аўтар AAlferez, крыніца

8 адказы

Вы Regex не прывязаны да пачатку і канцу радка, таму яна таксама адпавядае падрадка (е. Г. <�Код> 0.1.1.1 ў радку 10.1.1.1 ).

Як вы можаце бачыць, RegexBuddy адпавядае падрадка ў першым «незаконнага» нумар. Гэта правільна не супадае другі нумар, таму што тры лічба другога актэта не можа быць узгоднены на ўсіх:

RegexBuddy Screenshot

string pattern = @"^(?:[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-)$";

будзе вырашыць гэтую праблему.

Затым ваша рэгулярны выраз залішне складаным. Далей робіць тое ж самае, але прасцей:

string pattern = @"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.(?:[0-9]{1,3}|-)$";
9
дададзена
Дзякуй !!! Праца 100%
дададзена аўтар Ofir, крыніца

Вы Regex не прывязаны да пачатку і канцу радка, таму яна таксама адпавядае падрадка (е. Г. <�Код> 0.1.1.1 ў радку 10.1.1.1 ).

Як вы можаце бачыць, RegexBuddy адпавядае падрадка ў першым «незаконнага» нумар. Гэта правільна не супадае другі нумар, таму што тры лічба другога актэта не можа быць узгоднены на ўсіх:

RegexBuddy Screenshot

string pattern = @"^(?:[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-)$";

будзе вырашыць гэтую праблему.

Затым ваша рэгулярны выраз залішне складаным. Далей робіць тое ж самае, але прасцей:

string pattern = @"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.(?:[0-9]{1,3}|-)$";
9
дададзена
Дзякуй !!! Праца 100%
дададзена аўтар Ofir, крыніца

паспрабаваць:

@"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-"

вы не пачынаючы з самага пачатку тэксту

0
дададзена
Асцярожна, аб'ём вашага якара з'яўляецца памылковым з-за неабмежаваную чаргаванне ў сярэдзіне рэгулярнага выразы. Акрамя таго, вы прапусцілі знак канца радка-якар.
дададзена аўтар Tim Pietzcker, крыніца

паспрабаваць:

@"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-"

вы не пачынаючы з самага пачатку тэксту

0
дададзена
Асцярожна, аб'ём вашага якара з'яўляецца памылковым з-за неабмежаваную чаргаванне ў сярэдзіне рэгулярнага выразы. Акрамя таго, вы прапусцілі знак канца радка-якар.
дададзена аўтар Tim Pietzcker, крыніца

У вас не хапае ^ знак у пачатку рэгулярнага выразы.

Паспрабуйце гэта рэгулярны выраз:

^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-

Гэта C# Regex Шпаргалка можа спатрэбіцца

0
дададзена
Гэта той жа адказ, як дзве іншыя да вас, і ён змяшчае тую ж самую памылку, што іх ...
дададзена аўтар Tim Pietzcker, крыніца

У вас не хапае ^ знак у пачатку рэгулярнага выразы.

Паспрабуйце гэта рэгулярны выраз:

^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-

Гэта C# Regex Шпаргалка можа спатрэбіцца

0
дададзена
Гэта той жа адказ, як дзве іншыя да вас, і ён змяшчае тую ж самую памылку, што іх ...
дададзена аўтар Tim Pietzcker, крыніца

Калі вы падыходзіце супраць «10.1.1.1» на «0.1.1.1» частка вашай радкі будзе правільнае лік, і для гэтага вяртае ісціну.

Гэтае параўнанне з

@"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-"

з ^ знак у пачатку азначае, што вы хочаце, каб адпавядаць з самага пачатку.

0
дададзена
Гэта таксама вяртае True на 123.1.1 .- , які не павінен.
дададзена аўтар Tim Pietzcker, крыніца

Калі вы падыходзіце супраць «10.1.1.1» на «0.1.1.1» частка вашай радкі будзе правільнае лік, і для гэтага вяртае ісціну.

Гэтае параўнанне з

@"^[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9]\.[0-9]{1,2}\.[0-9]{1,3}\.-"

з ^ знак у пачатку азначае, што вы хочаце, каб адпавядаць з самага пачатку.

0
дададзена
Гэта таксама вяртае True на 123.1.1 .- , які не павінен.
дададзена аўтар Tim Pietzcker, крыніца