ورود

View Full Version : چک کردن صحت ایمیل



سینااکبری
سه شنبه 02 شهریور 1395, 11:21 صبح
سلام دوستان.
من در حال تست و تمرین انواع برنامه های ساده در جاوا هستم تا کمی مسلط تر بشم.
مشکلی که بر خوردم اینه که اگه بخوام یه کد بنویسم که کاربر آدرس ایمیلی رو وارد کنه و تست کنه برنامه که ایمیل درست وارد شده چجوری باید اقدام کنم.
آدرس ایمیل یه یوزر داره، یه @ و دامنه سرویس دهنده، و منظورم اینه چجوری چک کنم ایمیل یک at داره و...
ممنون میشم یه توضیحی بدید.
(تاحدودری فهمیدم مثل اینکه باید از Regular Expressions استفاده کرد ولی چیزی نفهمیدم)
ممنون

سینااکبری
سه شنبه 02 شهریور 1395, 11:23 صبح
ببخشید. به طور کلی اگه بخوام ببینم تو یک رشته چه چیز هایی هست و اگر از یه الگوی خاصی تبعیت نکرد کارهای خاصتی انجام بدم چجوریه؟

vahid-p
سه شنبه 02 شهریور 1395, 22:15 عصر
راهش استفاده از عبارت های منظم (Regular Expressions یا به اختصار Regex) است.
کافیه یه خورده در مورد علائم و قواعدش بخونی به راحتی میتونی در جاوا یا هر زبان دیگه ای ازش استفاده کنی (عبارت های منظم تقریبا استاندارد شده و در تمام زبان ها یکسان استفاده میشه پس میتونید از سورس کد سایر زبان ها هم استفاده کنی).

آموزش: http://www.tutorialspoint.com/java/java_regular_expressions.htm

برای ایمیل هم تا به حال یک regex کامل ندیدم. اکثر regex ها برای آدرس های ایمیل معمول جواب میده. کافیه سرچ کنید regex email validation
اینو هم ببین: http://www.regexr.com/3c0ol

سینااکبری
چهارشنبه 03 شهریور 1395, 11:41 صبح
دست شما درد نکنه, مرسی.
منتهی تو سایت توتوریال دیدم نفهمیدم چیزی.
ولی سایت دومی بهتره.
ممنون

سینااکبری
پنج شنبه 04 شهریور 1395, 11:09 صبح
سلام مجدد. من خیلی مطالعه کردم و نحوه تعریف و استفاده رو تا حدودی فهمیدم.
اما یکی، گروه رو نفهمیدم و دیگری بعضی عبارات. مثلا *.چیکار میکنه، یا d\\ و... بعضی از این عبارات نیست تو سایت ها
مثلا صد در صد اینو نفهمیدم.


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
private static String REGEX = "a*b";
private static String INPUT = "aabfooaabfooabfoob";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}


ممنون

vahid-p
پنج شنبه 04 شهریور 1395, 11:42 صبح
خب گفتید .* و \\d یعنی چی.

طبق همون سایت tutorials نوشته:
. یعنی Matches any single character except newline. Using m option allows it to match newline as well.
پس هر کاراکتری به جز خط جدید قابل قبوله. از طرفی * یعنی به هر تعداد دلخواه (هیچی یا هر تعدادی). پس یک خط رو کامل میتونه برات تشخیص بده. اینو در سایت دوم میتونی تست کنی.
در مورد \\d احتمالا یه سوء تفاهم شده. \\ به معنی تشخیص کاراکتر \ است و این عبارت فقط d\ رو مچ میکنه.
اما اگر در رشته در زبان جاوا اومده، دلیل اینکار اینه که \\ در رشته زبان جاوا معرف کاراکتر \ است و عملا رشته ای که برای regex منظورش هست d\ بوده نه d\\ ولی مجبوره به این صورت بنویسه. دلیلشم اینه \ در رشته (هنگامی که مستقیما در کدمون مینویسیم نه از کیبورد حین اجرای برنامه بخونیم) یک کاراکتر خاص هست و مثلا n\ به معنی خط بعده ولی اگر منظورمون یک رشته با بک اسلش و کاراکتر n باشه نه خط بعد، باید n\\ بنویسیم

پس d\ به معنی هر عدد یک رقمی است (Matches digits. Equivalent to [0-9].)

سینااکبری
جمعه 05 شهریور 1395, 12:02 عصر
خیلی ممنون از وقتی که گذاشتید.

Danial_abdi
چهارشنبه 10 شهریور 1395, 18:23 عصر
خب گفتید .* و \\d یعنی چی.

طبق همون سایت tutorials نوشته:
. یعنی Matches any single character except newline. Using m option allows it to match newline as well.
پس هر کاراکتری به جز خط جدید قابل قبوله. از طرفی * یعنی به هر تعداد دلخواه (هیچی یا هر تعدادی). پس یک خط رو کامل میتونه برات تشخیص بده. اینو در سایت دوم میتونی تست کنی.
در مورد \\d احتمالا یه سوء تفاهم شده. \\ به معنی تشخیص کاراکتر \ است و این عبارت فقط d\ رو مچ میکنه.
اما اگر در رشته در زبان جاوا اومده، دلیل اینکار اینه که \\ در رشته زبان جاوا معرف کاراکتر \ است و عملا رشته ای که برای regex منظورش هست d\ بوده نه d\\ ولی مجبوره به این صورت بنویسه. دلیلشم اینه \ در رشته (هنگامی که مستقیما در کدمون مینویسیم نه از کیبورد حین اجرای برنامه بخونیم) یک کاراکتر خاص هست و مثلا n\ به معنی خط بعده ولی اگر منظورمون یک رشته با بک اسلش و کاراکتر n باشه نه خط بعد، باید n\\ بنویسیم

پس d\ به معنی هر عدد یک رقمی است (Matches digits. Equivalent to [0-9].)

یاد نظریه زبانها و ماشینها افتادم ماشین های اتوماتا و .... . اگر سوال کنم که هدف oracle از این پیاده سازی در جاوا چی بوده قطعا یک بحث مفصل است . ولی بنظرم این خیلی جهش بزرگی است. آیا زبان C و خانواده محترمشان از این پیاده سازی عبارات منظم بویی بردند یا نه ؟

vahid-p
چهارشنبه 10 شهریور 1395, 19:14 عصر
یاد نظریه زبانها و ماشینها افتادم ماشین های اتوماتا و .... . اگر سوال کنم که هدف oracle از این پیاده سازی در جاوا چی بوده قطعا یک بحث مفصل است . ولی بنظرم این خیلی جهش بزرگی است. آیا زبان C و خانواده محترمشان از این پیاده سازی عبارات منظم بویی بردند یا نه ؟
چه جهش بزرگی؟
regex که مخصوص جاوا نیست، خیلی از زبان ها این تابع رو به صورت استاندارد در لایبرریشون دارن و در کل ویژگی یک زبان به حساب نمیاد. بله regex مخفف Regular Expression یا همون عبارت های منظم است و در نظریه زبان ها و ماشین ها تدریس میشه.
regex رو به راحتی در جاوااسکریپت، php، C# و... میتونید استفاده کنید یا در کل خودتون تابعش رو بنویسید. کلا لایبرری استاندارد C غنی نیست، و از اینکارشون هم اهدافی داشتن. اما لایبرری مچ کردن regex برای C وجود داره و به راحتی میتونید include کنید و ازش استفاده کنید.

Danial_abdi
چهارشنبه 10 شهریور 1395, 20:54 عصر
چه جهش بزرگی؟
regex که مخصوص جاوا نیست، خیلی از زبان ها این تابع رو به صورت استاندارد در لایبرریشون دارن و در کل ویژگی یک زبان به حساب نمیاد. بله regex مخفف Regular Expression یا همون عبارت های منظم است و در نظریه زبان ها و ماشین ها تدریس میشه.
regex رو به راحتی در جاوااسکریپت، php، C#‎‎‎‎ و... میتونید استفاده کنید یا در کل خودتون تابعش رو بنویسید. کلا لایبرری استاندارد C غنی نیست، و از اینکارشون هم اهدافی داشتن. اما لایبرری مچ کردن regex برای C وجود داره و به راحتی میتونید include کنید و ازش استفاده کنید.

من با زبانهای دیگر کار نکردم و فکر میکردم این امکانی که الان اراکل در نسخه 8 داده خیلی چیز خاصی است. اراکل خیلی دیر پس پیاده سازی کرده

vahid-p
چهارشنبه 10 شهریور 1395, 23:17 عصر
من با زبانهای دیگر کار نکردم و فکر میکردم این امکانی که الان اراکل در نسخه 8 داده خیلی چیز خاصی است. اراکل خیلی دیر پس پیاده سازی کرده
regex رو در نسخه 8 پیاده سازی نکرده، بلکه اولین بار در نسخه 1.4 یا همون 4 پیاده سازی کرده که میشه حدودا سال 2002! (در لینک https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html قبل Field Summery نوشته Since که مشخص میکنه از کدوم ورژن در دسترسه. تو این لینک مرجع کاملی از علائم و قواعد رو هم گفته)
اون موقع هم توسط سان میکروسیستم توسعه داده میشد که بعدها اوراکل خریداری کرد (هر چند نمیشه زبان برنامه نویسی جاوا رو تحت مالکیت جایی دونست)

اما اون چیزی که میگید از نسخه 8 وارد کرده احتمالا منظورتون Lambda Expression است که شباهت اسمش شاید باعث سوء تفاهم شده.