Loading...
Maria_ls avatar Maria_ls 383 Точки

String and Regexp - Exercises. Задача 10. Extract emails

Здравейте! Това е патерна, който съм измислила и хваща всички мейли, които трябва от примерите. Съответно задачата изкарва 75/100 в джъдж.А именно:

string pattern =@"\b[a-z](?:_?[a-z0-9\-\.]+@[a-z\-]+\.[a-z]+([\.a-z]+)?)\b";

Examples of valid emails: info@softuni-bulgaria.org, kiki@hotmail.co.uk, no-reply@github.com, s.peterson@mail.uu.net, info-bg@software-university.software.academy.

Examples of invalid emails: --123@gmail.com, …@mail.bg, .info@info.info, _steve@yahoo.cn, mike@helloworld, mike@.unknown.soft., s.johnson@invalid-.

Проблемът е, че не разпознава точката пред .info@info.info за забранен символ, а за граница на дума и ми взима като мач всичко след нея, т.е. info@info.info 

Та въпросът ми е как да включа точката в забранените символи? Моля за идеи?

Edit: Oказа се, че имало такова нещо като "lookaround", което върши тази работа...Source

Тагове:
1
Programming Fundamentals 19/10/2016 09:40:43
Plamen27 avatar Plamen27 599 Точки

Ех решението на тази задача е за милиони, аз се счупих докато изчистя този тест.

Решението е следното:

 string pattern = @" \b([a-z](?:_?[a-z0-9\-\.]+@[a-z\-]+\.[a-z]+([\.a-z]+)?))\b";

Cлагаш един интервал пред \b в стринга и това изчиства точката. Доста се препотих докато го открия.

Другата промяна в стринга е - понеже не знам какъв е кода ти и затова сложих целия израз между \b-тата в скоби иначе не работи, но при теб логиката може да е друга.

 

1
Maria_ls avatar Maria_ls 383 Точки

Последно го направих с този, понеже с интервал преди \b ми мачва по един интервал пред валидните мейли, а и бях пропуснала, че и след @ може да има число

string pattern =@"\b(?<!\S)(([a-z0-9\-\.]+@[a-z0-9\-]+\.[a-z0-9]+([\.a-z0-9]+)?))\b";

(?<!\S) - това има за цел да провери дали предишния символ преди началото на думата e нещо различно от интервал и само ако не е да мачне израза във вторите скоби

 

1
19/10/2016 10:41:44
Plamen27 avatar Plamen27 599 Точки

lookaround-a е интересно решение, ще го запомня

Предложения от мен фикс работи с интервала и скобите между израза ти.

Трябва да се вземе обаче 1 група. Затова ти казах дай си кода за да го напаснем към него.

0
Maria_ls avatar Maria_ls 383 Точки

https://dotnetfiddle.net/d9vAGF

Ето, обаче го редактирах с новия вече, след като с него си изкара 100/100

0
mrfreeman avatar mrfreeman 11 Точки

Мария, опитах да проследя твоя regex. Добавих (?<!\S), защото и аз изпусках случая с точката отпред (.info@info.info) и пак остана 75/100...До тук стигнах и не мога да открия какво му липсва

string pattern = @"\b(?<!\S)[\w][\w\.\-_]+-?[\w]*@[\w][\w\-]+.[\w][\w\.]+[\w]\b";

 

0
Maria_ls avatar Maria_ls 383 Точки

Това което виждам на пръв поглед e, че на теб ти хваща и част от невалидните emails: --123@gmail.com, …@mail.bg, .info@info.info, _steve@yahoo.cn, mike@helloworld, mike@.unknown.soft., s.johnson@invalid-.

Причината е че, [\w] обхваща букви, цифри и _ => за начало на мач в случая не е подходящо. Трябва да е само буква, т.е. a-z

Като цяло по условие мейла след първия символ трябва да е само от букви, цифри, тирета, точки (мисля, че не включва даже _, т.е. \w не е подходящо по принцип в задачата) и задължително завършва на поредица от букви, като преди това преди нея задължително е имало точка, преди която със сигурност е имало друга последователност от букви,цифри, тирета, като тази последователност - точка, букви -  може да се повтаря няколко пъти 

Всъщност пише че _ също може, но не в началото и в края на username (макар че в примерите явно го няма, т.к. аз не съм го включила никъде)

0
20/10/2016 23:29:09
mrfreeman avatar mrfreeman 11 Точки

Благодаря за насоките! :)

Като цяло е било грешно да ползвам \w. Преработих, тествах и даде 100 точки

 

ето го моя regex:

string pattern = @"\b(?<!\S)[a-z][a-z0-9\.\-_]+[a-z0-9]*@[a-z][a-z\-]+\.[a-z][a-z\.]+[a-z]?\b";

0
Plamen27 avatar Plamen27 599 Точки

C по-малко рязане успях да постигна това за 100 точки с твоя Regex:

string pattern = @"\b(?<!\S)((?<!\S)[a-z][\w\.\-_]+-?[\w]*@[\w][\w\-]+\.[\w][\w\.]+(\.[a-z]+[\-]?[a-z]+)?)\b";

Но като цяло Мария е права \w е лош избор тук.

0
21/10/2016 00:05:57
ZornitsaSerbezova avatar ZornitsaSerbezova 455 Точки

А на моя регекс какъв му е проблема тук?

            string[] text = Console.ReadLine().TrimEnd('.')
                .Split(new char[] {' '}
                , StringSplitOptions.RemoveEmptyEntries).ToArray();
            string pattern 
                = @"^([a-zA-Z0-9]+[.]*)([a-zA-Z0-9]*[-]*[a-zA-Z0-9]*)[@][a-zA-Z0-9]+[-]*[a-zA-Z0-9]*[.][a-zA-Z0-9]+([.]*[a-zA-Z0-9])*$";
            Regex regex = new Regex(pattern);
            foreach (var item in text)
            {
                if (regex.IsMatch(item))
                {
                    Console.WriteLine(item);
                }

0
Maria_ls avatar Maria_ls 383 Точки

1.Ако замениш ^ и $ с \b и \b поне ще ти хваща мейли, които не са сами на ред, а са част от изречение. Тогава идва проблемът, че ще ти хване от примерите за невалидни --123@gmail.com, и .info@info.info  заради това, че никъде не изключваш стринга да започва с . и -- . По принцип се оправя с един интервал преди първото \b (както предложи колегата Пламен), но не знам дали няма да ти направи проблем, защото ще ти мачне по един интервал преди всеки мейл, където има такъв. 

 

0
21/10/2016 16:31:49
ZornitsaSerbezova avatar ZornitsaSerbezova 455 Точки

Е да, но аз му ги подавам като стрингове един по един да ги валидира. и тези оп примерите работят.

Така ми е по-лесно и искам да го направя така, но не знам какво изпускам.

Т.е. кодът ми екстрактва мейлите, но явно в джъдж подават нещо, което е различно от примерите и което моят патърн не хваща.

0
21/10/2016 16:32:46
Maria_ls avatar Maria_ls 383 Точки

От примерните инпути няма да ти изкара никакъв резултат, тъй като не ти подават мейл един по един, а ги включват в изречение. ^ $ означават съотв. начало и край на стринг, т.е. поз. 0 и поз. string.Length-1

Това показва ли ти го? Please contact us at: support@github.com.

А видях, че си писала във фейса, че 1 тест не ти минава. Предпоследния ли е?

0
21/10/2016 16:40:04
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.