Loading...
stefism1 avatar stefism1 28 Точки

Regular Expressions - Lab, 03. Match Dates

Здравейте,
Може ли някой да ми каже защо на тази задача, когато подам регулярния израз по този начин 

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

не работи, а когато махна имената на групите и го подам по този начин

\b(\d{2})([-.\/])([A-Z][a-z]{2})\2(\d{4})\b

тогава работи?

Примера, който е даден във файла със задачата е написан с имената на групите, като го пусна в https://regex101.com също работи, а когато е имплементиран в кода на програмата, не работи и не хваща нищо.

Ползвам последната версия на Visual Studio ако това има значение.

Линк към задачата в judge: https://judge.softuni.bg/Contests/1667/Regular-Expressions-Lab

Линк към моя код на задачата: https://github.com/stefism/Projects/blob/master/02-C%23Fundamentals-May2019/31-RegularException/03-MatchDates/Program.cs

Благоря предварително за съдействието.

Тагове:
0
Module: C# Advanced
knoteva avatar knoteva 1081 Точки
Best Answer

Здравей,

Като си наименовал първата група(тя вече не е първа група, а си е група с име), втората става първа. :) Тоест трябва да е: \b(?<day>\d{2})([-.\/])(?<month>[A-Z][a-z]{2})\1(?<year>\d{4})\b. Съответно и при принтирането трябва да ползваш имената на групите.

1
stefism1 avatar stefism1 28 Точки

Здравей,

Благодаря за отговора.

Да, така стана, само не разбрах, защо в сайта regex101 моя израз работи и ги хваща, а в кода не?!

В същото време, ако поставя твоя израз с единицата в регекса, не хваща нищо! Нали уж каквото било на regex101 - само копи-пейст и готово? Някаква разлика в обработването на низа ли има в C#, не схващам?

 

1
22/07/2019 14:51:57
knoteva avatar knoteva 1081 Точки

Първоначално си мислех, че наименованите групи могат да се достъпват само по име, но изглежда, че в C# се нареждат след групите без име. Ето и 2 примера:

1. https://stackoverflow.com/questions/4275425/c-sharp-regexes-named-and-numbered-capturing-groups

var re = new Regex(@"(?<name>\w+)(x)\1\2");
Console.WriteLine(re.IsMatch("yxxy"));

Prints True, it appears unnamed capturing groups are numbered starting with 1, and then named capturing groups are assigned numbers afterwords.

 

2. Ако искаме да мачнем: Apr.16.2017_jan_07_2019

var regex = new Regex(@"\b(?<month>[A-Z][a-z]{2})([-.\/])(?<day>\d{2})\1(?<year>\d{4})_([a-z]+)_(?<someOtherGroup>[0-9]+)_([0-9]+)\b");

1 група, 2 група, 3 група, 4 група, 5 група, 6 група, 7 група

Screenshot VS: https://imgur.com/a/d5O1043

Решение: https://pastebin.com/e2LkUC6q

(В regex101 \1 трябва да е \2)

1
23/07/2019 08:34:21
stefism1 avatar stefism1 28 Точки

Мерси!

Трябва да пробвам, има един бутон generate code в regex101. Там може да прави правилно кода за C# и от там да го копирам.

1
23/07/2019 13:18:38
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.