Loading...
aanguelov avatar aanguelov 219 Точки

[Homework]C# Advanced - Regular Expressions - Problem {3} 'Extract Emails'

Здравейте, направих си един прост Regex (поне в моите очи) за extract-ване на имейли, който работи по следния начин:

03.ExtractEmails

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

Някой да има идея как да я "пропусна"?

Тагове:
1
C# Advanced
d3vildog avatar d3vildog 58 Точки

Здравей,

опитай с този "\b(\b[\w.\w]+\b)@(\b[\w.\w]+\b)\b" tongue-out

0
peterborisov avatar peterborisov 123 Точки

 string text = Console.ReadLine();
            string pattern = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
            Regex reg = new Regex(pattern);
            MatchCollection matches = reg.Matches(text);
            foreach (Match i in matches)
            {
                Console.WriteLine(i.Groups[0]);
            }

Това е моето решение.Може да ти свърши работа:)

0
Filkolev avatar Filkolev 4482 Точки

Забележи, че така хващаш имейли, които започват с долна черта, например _steve@yahoo.cn, който е посочен в условието като невалиден. Хващаш също и парчета от невалидни имейли като --123@gmail.com.

2
peterborisov avatar peterborisov 123 Точки

Мерси Фил ще трябва да се мъча още.

0
pataroka avatar pataroka 319 Точки

Колега aanguelov , и вашият регекс хваща невалидни и-мейли. Не е само точката проблема...

Колега d3vildog, вашият не хваща и-мейли с тире в юзъра... а освен това хваща невалидни и-мейли с непълен хост и/или юзър с начално тире или точка.

Използвайте не примерните входове, а примерите за валидни и невалидни и-мейли като си правите регексите...

Аз го докарах дотук: 

\w+([-.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

но въпросът е как да разкарам невалидните с точки и тирета в началото...

1
15/05/2015 20:27:22
rulzzzbg avatar rulzzzbg 1 Точки

След като си получил резултатите от горния регекс мачваш всеки един резултат. 

pattern = new Regex("^[a-zA-Z]");
        foreach (Match m in matches)
        {
            var result = pattern.Match(m.Groups[0].Value);
            if (result.Success)
            {
                Console.WriteLine(m.Groups[0].Value);
            }
        }
0
pataroka avatar pataroka 319 Точки

За да сработи това предложение, трябва да редактирам моя регекс да хваща и невалидни с '-', '.', '_' в началото и след това да ги изолирам с нов регекс. 

И това май не е толкова лош подход...

0
16/05/2015 10:39:06
malkstor avatar malkstor 348 Точки

Аз успях да стигна до това

(\w+\.?-?\w+?\.?\w+)@(\w+.\w+\.?\w+\.?\w+)

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

4-та е по-лесна :)

0
onefen avatar onefen 27 Точки

аз мисля, че моят работи коректно вече. Ето до къде го докарах patern-а:

 string pattern = @"(?<user>[a-z][\w.-]+)@(?<host>[a-z][\w-]+\.[a-z]+)";

0
pataroka avatar pataroka 319 Точки

Мне, не работи. Хващаш невалидни имейли с '.' и '_' в началото, не хващаш валидни имейли с повече от 2 думи в хоста... 

0
16/05/2015 10:38:36
onefen avatar onefen 27 Точки

(?<user>[a-z][\w.-]+)

би трябвало да не хваща емайли започващи с . или _

0
aanguelov avatar aanguelov 219 Точки

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

Имам едни въпрос, на който се надявам да има еднозначен отговор - има ли начин да се сътвори регекс от следния тип:

"Хвани ми израз, който започва след whitespace и започва точно с буква и след буквата да има букви или точки, тирета и подчертавки, ама последните може и да ги няма, и по средата на израза да има @ и след него да има поне две думи, разделени с точка и вътре в думите може да има тире, ама може и да няма и края на израза да е точно буква"?

0
16/05/2015 10:43:28
pataroka avatar pataroka 319 Точки

Ами то половината регекси постнати тук правят горе-долу това :)

0
onefen avatar onefen 27 Точки

Според мен не би трябвало да е така, но... тия Regular Expressions са на друго мнение. Голям филм са. Дам явно има за доискусуряване

0
pataroka avatar pataroka 319 Точки

А за тези, на които им е интересно, ето как изглежда генериран чрез Pearl регекс, който валидира имейли според RFC822 стандарта http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

3
lazarov0088 avatar lazarov0088 29 Точки

Това работи с всички примери от домашното:

using System;
using System.Text.RegularExpressions;
class Extract_Emails
{
    static void Main()
    {
        string input = Console.ReadLine();
        string pattern = @"((?<=\s)[a-zA-Z0-9]+([-.]\w*)*@[a-zA-Z]+?([.-][a-zA-Z]*)*(\.[a-z]{2,}))";
        Regex regex = new Regex(pattern);
        MatchCollection matches = regex.Matches(input);
        Console.WriteLine("Found {0} matches", matches.Count);
        foreach (Match match in matches)
        {
            Console.WriteLine("Email: {0}", match.Groups[1]);
        }
    }
}

0
alex.mitev avatar alex.mitev 20 Точки

намерих грешката - match-ва "-" преди @

penko.goshov-@neshto.com is a match!

0
alex.mitev avatar alex.mitev 20 Точки

Здравейте, аз го докарах дотук, след 10-тина поправки, кажете какво мислите:

(?<=\s)[a-zA-Z0-9]+([\.\-\_]+(?:[a-zA-Z0-9]+))*@[a-z]+(?<=[a-z])(-?[a-z]+)*(\.[a-z]+(?<=[a-z]))+\b

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

Мерси

0
02/12/2015 14:18:08
lazarov0088 avatar lazarov0088 29 Точки

Първата половина от регекса е ок.
Втората половина след @ можеш да я подобриш да не хваща
penko.goshov@neshto.c
който е не е валиден имейл, въпреки че не е посочен изрично в условието.
Например така  ((?<=\s)[a-z0-9]*(?:\w+[-._]\w+)*@\w+([-.]\w+)*\.\w{2,}([-.]\w{2,})*)

1
02/12/2015 14:58:30
alex.mitev avatar alex.mitev 20 Точки

Така е, мерси. 

Ето поправката:

 

(?<=\s)[a-zA-Z0-9]+([\.\-\_]+(?:[a-zA-Z0-9]+))*@[a-z]{2,}+((?<=[a-z])(-?[a-z]+))*(\.[a-z]{2,}+)+\b

 

0
oxygen avatar oxygen 7 Точки

Това е моето решение:

(?:\s*)([a-zA-Z0-9]+[\.|\-|\_]?[a-zA-Z0-9]+@[a-zA-Z]+[\-]?[a-zA-Z]+[\.]?[a-zA-Z]+[\.][a-zA-Z]+)

0
KrumKrumov avatar KrumKrumov 6 Точки

\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}\b 

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