Loading...
Eminem avatar Eminem 0 Точки

3. Match Dates, Lab: Regular Expressions C#

Привет Колеги!

За задачата Match Dates имам три възможни регекса. Първият е мой, вторият е на колега а третия е показан от Софтуни в документа със задачата. Онлайн(в Regex101 и RegXr) и трите регекса работят перфектно, мачват си всичко както трябва. Докато след имплементацията им във C#, работи само първия а вторите два не мачват нищо. Ето ги въпросните регекси:

1. Моя: @"\b(?<day>[0-3][0-9])(?:(-)|(.)|(\/))(?<month>[A-Z][a-z]{2})(\1|\2|\3)(?<year>[0-9]{4})\b";

2. На колегата: @"\b(?<day>[\d]{2})([-\/.])(?<month>[A-Z][a-z]{2})\2(?<year>[0-9]{4})\b";

3. Показан от Softuni: @"\b(?<day>\d{2})([-.\/])(?<month>[A-Z][a-z]{2})\2(?<year>\d{4})\b";

Ето го и input-a:

13/Jul/1928, 10-Nov-1934, , 01/Jan-1951,f 25.Dec.1937 23/09/1973, 1/Feb/2016

При един и същ Input, онлайн работят и трите регекса а във Visual Studio само първия.

Има ли някой, който може да обясни разликата в поведението?

Благодаря предварително!

 

 

Тагове:
0
Fundamentals Module 31/07/2019 15:44:15
krum_43 avatar krum_43 756 Точки

От къде си сигурен,че мачват всичко както трябва.Това,че си изпробвал няколко неща не значи,че мачват всичко.

Ako  работят правилно в Regex101 C# не може да им счупи логиката.

Най-вероятно не си ги написал добре.

                                        :):):)

0
Steliyan_Benev avatar Steliyan_Benev 2 Точки

Аз имам същия проблем - не работи в си шарп нищо от показаното в отговора на софтуни. Сам си го направих същия регекс като на софтуни, но в си шарп не сработва. Направо се побърках да търся защо се получава така и все още не мога да намеря решението. В регекс 101 всичко е ок.

0
Axiomatik avatar Axiomatik 2422 Точки

Additional explanation given in the SoftUni Regex Lab-exercises for numbering backreferences with named and un-named groups in C# (page 6):

 

First off, we’re going to put our RegEx in a variable and get a MatchCollection from the string:

@"\b(?<day>\d{2})([-.\/])(?<month>[A-Z][a-z]{2})\2(?<year>\d{4})\b";

Since RegEx works differently across different languages, before we continue, we’re going to set our backreference from \2 to \1. This is because C# backreferences don’t count named capture groups for backreferences. So, change it before we continue.

 

-This should work without a problem:

@"\b(?<day>\d{2})([-.\/])(?<month>[A-Z][a-z]{2})\1(?<year>\d{4})\b";

 

-Regex 2 works because there are only two named groups before the backreference occurs.

-Regex 3 doesn't work if not changed because there are two named groups and one un-named group before the backreference.

1
Elena123456 avatar Elena123456 235 Точки

Thanks!

I have already understand: in C# group 1 is the first group without name, group 2 is the second group without name..., but all groups with name are after tha last group without name in order from left to the right.

By the way does https://regex101.com/ has the option to set the regex to work correctly for C#?

0
Axiomatik avatar Axiomatik 2422 Точки

Not that I know of unfortunately, I always had to double-check when I used some Regex for my C# code (same thing with https://regexr.com). Basically, you only had to be carefull with how groups were being interpreted by C# (named, unnamed, ...). The practise exams will show you what to watch out for and when you get an RunTime error then just check your Regex (https://www.regular-expressions.info/named.html for some additional reading-help).

Best,

1
20/11/2020 17:08:37
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.