PDA

View Full Version : سوال: Regular Expression یا ... برای فیلتر ایمیلها با توجه به نوع ایمیل ...



ostovarit
یک شنبه 14 شهریور 1389, 13:59 عصر
با سلام و خسته نباشید.

1- قصد دارم با Regular Expression یا ... برای فیلتر ایمیلها با توجه به نوع ایمیل اقدام کنم یعنی یک لیست ایمیل دارم میخوام ایمیل های یاهو رو از داخلش پاک کنم و بقیه ایمیل ها مثلا جی میل یا هات میل یا ... باقی بمونه ... (این سوال رو با RX حل کردم)

2- یک الگو برای تشخصی ایمیلهای متفرقه میخوام یعنی ایمیلهایی که از نوع یاهو جی میل و هات میل نباشند ... ( این سوال با تابع Contains به جواب رسید)

سورس کد نمونه لینک پیشنهاد و... شما عزیزان را نیازمندیم ...
لطفا لینک آموزش Regular Expression ارسال نفرمایید.
با تشکر

حجتی نیا
یک شنبه 14 شهریور 1389, 14:07 عصر
میشه ایمیل رو از اولین کارکتر بررسی کرد و از کارکتر @ به بعد دید که واسه کجا هست ..

ostovarit
یک شنبه 14 شهریور 1389, 14:12 عصر
میشه ایمیل رو از اولین کارکتر بررسی کرد و از کارکتر @ به بعد دید که واسه کجا هست ..

میشه بیشتر توضیح بدی دو خطی برام کد بنویسی ... من یک کم گیر کردم سر این قضیه ...

cheshm6k
یک شنبه 14 شهریور 1389, 14:28 عصر
میشه ایمیل رو از اولین کارکتر بررسی کرد و از کارکتر @ به بعد دید که واسه کجا هست ..

سلام . با احترام به فرمایش دوستمون ، اما نیاز به این کار نیست .
از تابع Contains استفاده کنید .
فرض کنید strEmail همون آدرس میلمون باشه .

if(strEmail.Contains("@yahoo.com"))
{
}
این تابع مقدار بولین برمیگردونه. همونطور که از معنیه لغوی تابع میشه فهمید اگه شامل زیر رشته باشه مقدار true در غیر اینصورت false برمیگردونه.

موفق باشید.

Sajjad.Aghapour
یک شنبه 14 شهریور 1389, 15:00 عصر
سلام . با احترام به فرمایش دوستمون ، اما نیاز به این کار نیست .
از تابع Contains استفاده کنید .
فرض کنید strEmail همون آدرس میلمون باشه .

if(strEmail.Contains("@yahoo.com"))
{
}
این تابع مقدار بولین برمیگردونه. همونطور که از معنیه لغوی تابع میشه فهمید اگه شامل زیر رشته باشه مقدار true در غیر اینصورت false برمیگردونه.

موفق باشید.

در کل استفاده از توابع رشته ها Performance بهتری نسبت به RegularExpression دارد.اما استفاده از آنها در اینجا، چون فرمت ایمیل در قالب یک pattern بیان میشود انعطاف پذیری خود را از دست خواهد داد.
شاید در اینجا بتوانید دامین های ymail و rocketmail را هم که متعلق به یاهو هست اضافه کنید، اما همیشه به این سادگی نخواهد بود.

میتونید برای این کار از عبارت زیر به عنوان pattern ایمیل های یاهو استفاده کنید

string yMail = @"^([a-zA-Z0-9_\-\.]+)@(((yahoo)|(ymail)|(rocketmail))\.[a-zA-Z0-9]{2,})$";


در پست 14 تاپیک زیر در این باره مطلبی وجود دارد.میتوانید توابع را گسترش دهید و استفاده کنید
http://barnamenevis.org/forum/showthread.php?t=185313

موفق باشید

cheshm6k
یک شنبه 14 شهریور 1389, 16:04 عصر
در کل استفاده از توابع رشته ها Performance بهتری نسبت به RegularExpression دارد.اما استفاده از آنها در اینجا، چون فرمت ایمیل در قالب یک pattern بیان میشود انعطاف پذیری خود را از دست خواهد داد.


فرمایش شما کاملا درسته اما ... همانطور که خودتون هم گفتین، باید پذیرفت که پیچیدگی زمانی الگوریتم تعیین وجود یک زیر رشته در رشته، به مراتب کمتر از چک کردن صحت قالب تعریف شده برای میل هست . و با توجه به نیاز دوستمون که فقط میخوان ببینن میلشون از طرف کدوم میل سروره ، ترجیح من در این مورد، استفاده از اون تابع است.

موفق باشید .

Sajjad.Aghapour
یک شنبه 14 شهریور 1389, 16:23 عصر
با تشکر از شما دوستان عزیز
من جواب سوال یکم رو گرفتم و با RX حلش کردم ... تو الگوریتم یاهو مشکل داشتم که به لطف اقا سجاد حل شد ...

الان مشکل من جدا سازی ایمیل های متفرقه مثل ایمیل های سایتها است ...
یعنی ایمیلهایی که از سرور گوگل یاهو و هات میل هستند شناسایی و حذف شوند و حاصل ایمیل های متفرقه باشد ...

میتونم این رو با چند تا if بنویسم اما اگر امکانش باشه که با یک خط RX نوشته بشه بهینه تر و خوانا تر خواهد بود ...

ممنونم

@cheshm6k :
فرض کنید در اینجا منظور فیلتر کردن 10 میل سرور هست که هرکدام هم چندین دامین را دربر خواهند داشت.
آیا پیشنهاد شما اینه که برای همه if نوشته بشه و به این صورت فیلتر بشه؟

برای تشخیص ایمیل های متفرقه و یا همین وجود ایمیل ها بهتر هست از روش شما استفاده بشه یا با دادن یک Pattern و ریختن نتایج توسط تابع Matches در یک MatchCollection ؟

پ.ن: جواب سوال در سوالاتی که پرسیدم وجود دارد

cheshm6k
یک شنبه 14 شهریور 1389, 17:10 عصر
@cheshm6k :
فرض کنید در اینجا منظور فیلتر کردن 10 میل سرور هست که هرکدام هم چندین دامین را دربر خواهند داشت.
آیا پیشنهاد شما اینه که برای همه if نوشته بشه و به این صورت فیلتر بشه؟

در این مورد بله . توجه داشته باشید که قالب تمامی سرورها یکی نیست و ممکنه دسترسی به قالب همه اونها مقدور نباشه . ضمن اینکه پیاده سازی تایید صحت قالب، نیز تشکیل شده از همین ifو andو orها و .... در صورتیکه بسیاری از کارهایی که انجام میده اصلا مورد نیاز دوستمون نیست. شاید از لحاظ ظاهری دلچسب نباشه اما از لحاظ بازدهی و سرعت به مراتب بهتر عمل خواهد کرد.

ostovarit
یک شنبه 14 شهریور 1389, 21:38 عصر
با سلام مجدد و تشکر از پاسخ هایی که دادید مشکلم حل شد ...

یک سوال در باره بهینه بودن کدها دارم برای شماردن یک کارکتر خاص در یک متن از کدام روش استفاده کنیم بهتر و سریع تر است :

روش اول:


// Count characters. White space is treated as a character
System.Text.RegularExpressions.MatchCollection charColl = System.Text.RegularExpressions.Regex.Matches(strOr iginal, @".");
MessageBox.Show(charColl.Count.ToString());
روش دوم:


public static int CountOccurencesOfChar(string instance, char c)
{
int result = 0;
foreach (char curChar in instance)
{
if (c == curChar)
{
++result;
}
}
return result;
}