[C#] Домашно Strings and Text Processing - 18 задача


7

Условие: Write a program for extracting all email addresses from given text. All substrings that match the format <identifier>@<host>…<domain> should be recognized as emails.

Решениеsource.

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

Edit: Ето и пълен регулярен израз, ако на някой случайно му потрябва.




Отговори



2

Решението ти не работи с примера даден в книгата на Наков:

Please contact us by phone (+359 222 222 222) or by email at example@abv.bg or at baj.ivan@yahoo.co.uk. This is not email: test@test. This also: @telerik.com. Neither this: a@a.b.

Изважда и a@a.b.

Аз се опитах да я реша без регулярни изрази:

CLICK!!!

За символи приемам букви, цифри , '@' , '.' , '_' , '-'.

identifier не го приемам под 6 символа, а domain-а не го приемам под 2 символа, както е по принцип един e-mail адрес.


от ivaylo.kenov (30760 точки)


0
Аз казах, че решението е само примерно.

от jasssonpet (6814 точки)

0
Според мен решението ти е идеално и кратко, просто отбелязах, аз си поиграх известно време с моето... А тоя стандарт кърти :D

от ivaylo.kenov (30760 точки)



3

Решение:

http://pastebin.com/KjMQifqb

Обяснение:

На кратко ще кажа че правя 7 bool-a чрез който да обхвана всички задължителни критерии за да е валиден емайл.

След което с множество if-ве проверявам дали е така.

Проверки:

Всичко започва от това дали имаме "@" след което и запазваме индекса. От там нататък всички проверки са преди @ след нея и т.н.. Например преди @ ДО първия space(whitespace) имаме ли буква, ако да тоя bool e TRUE. След което след @ имам ли буква, след буквата имам ли точка, след точката и края на емайла имам ли буква и дължина от минимум 2 символа. Края на емаийла е равен на първият  space(whitespace) надясно от @. Накрая всички bool променливи трябва да са True. И само тогава печатам съответния е-майл

В общи линии някакви такива неща се случват, дори докато пишех поста, ми дойде на ум една оптимизация.

Оптимизация:

Всички bool да им присвоя true в началото. След което ако изкочи bool който става false, не изпълнявам цикъла и операциите надолу а се връщам в първия for цикъл като увелича водещатата променлива. Някаква такава идея имам :)

Дано някой да е разбрал нещо от тия спагети :)


от Assi.NET (3050 точки)


0
Ами да ти кажа честно и аз го направих като теб, само че почти до края, и се изнервих от толкова ифове, и разгледах тези регулярни изрази от различни страници, които колегите са посочили, и там има различни начини да си направиш израза, който ти трябва и наистина е пъти по-леко а и накрая май не е толкова сложно колкото изглежда.

от Svetli (280 точки)

0
Ако ги разбереш ще ми ги обясниш. Защото все пак е по лесно някой да го обясни, особено някой на твоето ниво :)

от Assi.NET (3050 точки)


23

Първо разделям думите в масив от стрингове по разделител интервал.

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

Regex.IsMatch връща булева стойност, която при истина означава, че търсеният низ е намерен.

[\w.]{2,20}@[\w]{2,20}[.]{1}[\w.]{2,6}

Означава: от 2до 20 букви, цифри или подчертавка, следвани от кльомба, следвани от 2-20 букви, цифри или подчертавка, следвани от една точка, следвани от 2 до 6 букви, цифри или точка.

http://pastebin.com/x6d5mpmP

Регулярния израз го конструирах на този сайт, много ми хареса, обясненията са хубави, просто слагаш какво искаш да намериш и пробваш, докато сглобиш израза:

http://regex101.com/




0
Merci, за сайтчето за изразите и мерси за точни израз, който даде, спести мотане доста :)

от stoyankm (5 точки)

0
Супер е този сайт. Много благодаря! Голямо пате в кълчища съм с тия регулярни изрази :)

от sylviapsh (302 точки)



1

Едно решение без регулярни изрази.




0

Не успях всички валидни мейли да хвана, че май и някои невалидни взема, но работи почти прилично:

http://pastebin.com/7JKGTKtZ


от sylviapsh (302 точки)


1

Поиграх си малко с тези регулярни изрази и тъй като съм нов, става малко по-бавно, но направих един, който мисля, че изпълнява зададеното в условието - ([^\s"(),:;<>@[\]]{4,})(@{1})(\w{4,})(.{1})(\w{2,}(?:.\w{2,})?)

Поправено - ([^\s"(),:;<>@[\]]{4,})\@(\w{3,})\.(\w{2,}(?:\.\w{2,})?), по препоръка на @jasssonpet. Тук се ескейпват "@" и ".", и се показват само id-to, хоста и домейна.

Най-кофти беше накрая да мачна, ако има примерно само .com или пък .co.uk

Ето едно сайтче - http://www.regular-expressions.info, в което се обясняват доста обстойно регулярните изрази.




0
Вместо (.{1}) може да ескейпнеш точката с \. Също и "@", щом е само веднъж. Иначе си изпуснал да ексейпнеш последната точка "(?:\.\w{2,})" и мачва например цялото "nakov@telerik.com test", ако не е .co.uk.

от jasssonpet (6814 точки)


0

https://github.com/martinangelos88/CSharpProject/blob/master/8.HomeWork%20-%20StringsAndTextProcessing/18.ExtractEmail/18.ExtractEmail.cs

Значи решението ми е Уникално, Креативно ( тъпо), просто бързам да се готвя за изпита, а исках да бъде пълно като изписва подробно кога е правилна пощата и кога не.

Незнам как работи вкарал съм в Try catch IF които ако върне TRUE

пуска Foreach ако върне FALSE пуска IF които играе ролята на IF и на Statement, Else няма, ползвам понеже са нестнати в Try catch Finally  и любимото ми Environment.Exit(0); . Някои да каже така бива ли решението.

Като го видя си мисля за спагети :)

П.С.  jasssonpet Ме зариби по използването на регулярните изрази с неговите решения по 1 ред cheeky.


от Martin88 (209 точки)


0
Еми по тая тема за валидиране на имейли ако отворите някой пример в нета ще видите най-различни решения, така че може цял ден да си играем да пишем регулярни изрази, а и няма как да проверим дали хоста и домейна са валидни без да се свързваме към нета в програмата... Моето решение няма смисъл да го поствам защото е на 90% същото, само дето валидирането на домейна ми е с [\w\.]*, като така мислех да покрия и .co.uk и някакви други такива да речем.

от Rokata (397 точки)


1

Решение: source

Извличам мейлите с помощта на регулярен израз и ги слъгам в списък.След това печатам списъка. Регулярният израз не е пълен или по стандарт, но върши работа.


от stanchev (197 точки)


6

С много проверки успях да нагода задачата. Проверявам дали текущият символ от текста е '@'. Ако е така взимам думитеотдясно и отляво на този символ и това ми е емайлът.

Решение


от teleriknetwork (2734 точки)