您的位置:首页 > 编程语言 > Java开发

用正则表达式简单实现邮箱登陆注册等功能

2018-01-19 10:19 549 查看

前言

正则表达式(Regular Expression)作为在许多语言中都存在的逻辑表达式。被广泛应用在检索、替换等对文本进行操作的功能实现中。比起复杂的for循环和if的嵌套,正则表达式则更加简洁高效,但是它的缺点也在这儿,由于过于符号化,正则表达式往往不够直观,如果对正则表达式的符号规则不太熟悉,那么它往往成为了阻碍我们阅读代码文本的绊脚石。这篇博客通过简单的实现一个邮箱类来谈谈如何去理解正则表达式,更来具体的展望它的实际应用。

分析

现在我们要写一个简单的邮箱(Email)类,要简单实现邮箱的注册(register)功能和登录(login)功能,其次为了体现完整性我们附加了退出选项和查看数据的功能。

我们来分析一下这个类说需要的属性和方法:

属性:

邮箱名:emailname;邮箱密码:emailcode

方法:

注册:registEmailName()®istEmailcode() 注册邮箱方法和注册邮箱密码的方法

登录:loginEmail() 登录邮箱的方法

当然为了华丽点我们还做了一个操作界面:welCome()

这里有人问了为什么要将邮箱名和邮箱密码注册分开写?如果只是简单的实现那么合起来分开倒是并无大碍,但是如果我们讲究严谨的逻辑,那么分开密码的邮箱名是根据实际的情况讲究的:因为我么使用的邮箱一般名字的固定不变的,因为邮箱名存在唯一性。但是密码往往会随着情况而改变。所以在设计的初期考虑到这些功能我们就能在后面修改或者增删时游刃有余。

闲话少说我们来进入代码的环节:

注册方法的实现

在注册方法实现前,我们先来讨论邮箱名和密码有什么具体的特征?

比如邮箱名,往往是以XXX@XX.com或者.cn结尾的,而且@前后的两个字符串均以字母和数字以及下划线组成,所以如果用IF和FOR来实现的话,往往需要臃肿的代码和严谨的逻辑。但是在正则表达式里只需要限定相应的表达式便能完成对格式的约束。

到底有多简单我们直接贴出它的表达式来分析“^[a-zA-Z1-9_]\w+@\w+.(com|cn)”

也许你看到这里会觉得一头雾水,这是些什么东西?没关系我们来慢慢分解它:首先看^[a-zA-Z1-9_]表示了什么?在正则表达式的开头是用‘^’来表示限定开头字符的范围。[a-zA-Z1-9_]便是我们开头第一个字符所要约束它的范围。第一个字母总不能以0开头的吧。我们接着分析,\w表示什么呢,在正则表达式中\w匹配任何字类字符,包括下划线。与”[A-Za-z0-9_]”等效。+表示一次或多次匹配前面的字符或子表达式。在Java的正则表达式中’\’需要使用转义符来输出,所以正则表达式为\\,因此我们实则在表达式要表示\w的时候需要加转义符号成了\\w,这里组合起来\w+就表示了@前首字母后的字符串的约束,他们是在a-zA-Z0-9_ 中的字符。我么直接使用@来匹配检验字符的@,这里距离“hello world”的正则表达式其实就是匹配hello world的字符串的,所以单字符亦然。综上我们就能理解了后面\w和\.的含义了,那么[com|cn]是什么意思呢?正则表达式中‘|’将两个匹配条件进行逻辑“或”(Or)运算:例如x|y匹配x或者y。所以这也限定了邮箱名后面域名的约束。

说了这么多我们来看看注册函数到底如何简单的实现:

class Email {
private static int i = 0;
private static String emailname;
private static String emailcode;

private Email() {
}
………………//邮箱类的主题
public static void registEmailName() {//邮箱名的注册方法
registLine();
System.out.println("请输入邮箱帐号:");
Scanner scanner = new Scanner(System.in);
String stringEMN = scanner.nextLine();
String regexEMN = "^[a-zA-Z1-9_]\\w+@\\w+\\.(com|cn)";//这里是正则表达式的应用
if (stringEMN.matches(regexEMN)) {
Email.emailname = stringEMN;
registEmailcode();
} else {
System.out.println("邮箱帐号格式不正确,请重新输入!");
registEmailName();
}

}

private static void registEmailcode() {//邮箱密码注册方法
Scanner scanner = new Scanner(System.in);
System.out.println("请输入1-8位邮箱密码:");
String stringPCode = scanner.nextLine();
String regexPCode = "^[a-zA-Z1-9]\\w{1,8}";//这里同样给出了邮箱密码的正则表达式
if (stringPCode.matches(regexPCode)) {
Email.emailcode = stringPCode;
System.out.println("注册成功!");
DataBase.setEmailNameArray(i);//与后面输出邮箱名密码有关
DataBase.setEmailCodeArray(i);
i++;
} else {
System.out.println("密码格式错误,请重新输入!");
registEmailcode();
}
}


从上面我们看出通过单条if判断语句和正则表达式我们便实现了对邮箱名字和密码的约束判断。当不符合约束规则的时候返回false来重新调用注册方法来实现正确格式的注册。可以说正则表达式是一种简单可行的具有强约束力的逻辑判断表答式,我们来看下运行的结果:



登录方法的实现

在实现注册方法后我们将从系统控制台读取的字符串赋予了类的成员变量。然后我们呢就需要通过一个带有判断语句的登录方法来验证信息是否与注册的相同:这里用到了Scanner类来接受键盘的输入。登录方法的实现依托着注册方法的实现,我们在这里简单模拟了登录方法,但是在实际中我们所要写的登录方法远远比这个实现起来千差万别。因为登录信息尤其是密码是用户的个人隐私,所以我们要考虑用户输入密码时的加密性,还要考虑用户密码在输入后的存储安全问题。这里我们先简单的写出我们的邮箱类登录方法。

public static void loginEmail() { //登录方法
loginLine();//在类中写的分割线方法
System.out.println("请输入邮箱帐号:");
Scanner scannerInput = new Scanner(System.in);
String inputName = scannerInput.nextLine();//接收键盘输入的邮箱名
System.out.println("请输入邮箱密码:");
String inputCode = scannerInput.nextLine();//接收键盘输入的邮箱密码
if (emailname.equals(inputName)&&emailcode.equals(inputCode)) {
System.out.println("登录成功!");
} else {
System.out.println("帐号或密码错误,请重新登录!");
loginEmail();
}
}


运行结果:



整体的完善

我们写完登录方法和注册方法后基本已经模拟了进入邮箱前的两大基本功能。当然我目前在JavaSE的基础学习阶段,没有完整学习Java中数据库的相关操作和可视界面的创建。所以我们也在这里使用方法来简单模拟数据库和界面的实现:

class Email {
private static int i = 0;
private static String emailname;
private static String emailcode;
public static String getEmailname() {//get基本方法
return emailname;
}

public static String getEmailcode() {//get基本方法
return emailcode;
}

public static void registLine() {//为了美观而写的分割线提示字符串方法
TesteMail.Line();
System.out.println("欢迎注册小白邮箱!");
TesteMail.Line();
}

public static void loginLine() {//为了美观而写的分割线提示字符串方法
TesteMail.Line();
System.out.println("欢迎登录小白邮箱!");
TesteMail.Line();
}

public static void registEmailName() {……}//注册邮箱名方法
private static void registEmailcode() {……}//注册邮箱密码方法
public static void loginEmail() {……}//登录方法

public static void welCome() {//简单模拟的操作界面
TesteMail.Line();
System.out.println("欢迎使用小白邮箱!");
TesteMail.Line();
System.out.println("请输入对应数字执行功能:" + '\n' + "1.注册邮箱" + '\n' + "2.登录邮箱" + '\n' + "3.退出" + '\n' + "4.查看数据库");
TesteMail.Line();
Scanner scannerWelcome = new Scanner(System.in);
int flag = scannerWelcome.nextInt();//通过捕捉用户的操作数来调用方法
switch (flag) {
case 1: {//注册
registEmailName();
welCome();

break;
}
case 2: {//登录
loginEmail();
welCome();
break;
}
case 3: {//退出
System.out.println("谢谢使用!");
break;
}
case 4: {//查看数据库
DataBase.printDateBace();
}
default: {//报错
System.out.println("输入错误,重新输入!");
welCome();
}
}

}
}

class DataBase {//模拟的数据库类,用来存放输入的信息
static String[] emailNameArray = new String[10];
static String[] emailCodeArray = new String[10];

public static void setEmailNameArray(int i) {//set基本方法
DataBase.emailNameArray[i] = Email.getEmailname();
}

public static void setEmailCodeArray(int i) {//set基本方法
DataBase.emailCodeArray[i] = Email.getEmailcode();
}

public static void printDateBace() {//打印方法,遍历了String类的数组
TesteMail.Line();
for (int i = 0; i < emailCodeArray.length - 1; i++) {
System.out.println(emailNameArray[i] + "  " + emailCodeArray[i]);
}
TesteMail.Line();
}
}


我们通过一个Switch的多项选择来时间通过数字来调用相对应的功能,然后我们在注册执行成功的时候调用数据库的方法来将目前Email类中的信息存入数据库,然后通过PrintDataBase来查看里边的信息。这里为了实现简单,同一使用了静态的方法和变量。其实在实际应用中我们的信息大部分是动态而且不会存在本地的,这是用来保证用户信息的安全性所做的考虑。而且具体的存储方式在学习数据库后我们还会进行相关的完善。整体上这个类实现了对简易邮箱的模拟实现,但是要让它比肩实际应用,我能还需要更多的功能完善和安全性考虑,还要有后面整个邮件收发写系统的整合!这是一个不断学习和重新认识编程开发的过程,所谓心急吃不了热豆腐,我们想要做出一个像样的系统,扎实的基础是不能忽略和必须践行的准则。

这里在附加运行结果的截图:



关于正则表达式的深入

正则表达式的逻辑符号丰富,我们要记忆和熟练掌握它需要大量的阅读和实践。但是它来带的效率提升也是直观的。所以这里提供了正则表达式的相关符号图仅供大家参考,具体的操作还需要认真阅读相关知识和勤奋的实际操作,所谓好记性不如烂笔头,实践出真知,实践才是硬道理!







图片来源于百度百科

写在最后的小问题

喜欢探究和严谨的读者或许会发现这个小程序中的不足和缺陷,这里我也提出一些个人认为的不足:例如多次注册后登录验证的其实是没用调用数据库中说存的信息进行判断的,学而有余的读者我建议可以发挥自己的聪明才智来完善这个功能。还比如对密码的修改、再者是注销功能的实现和登录成功后无法在继续登录的问题等等…欢迎大家和我这个新手来探讨交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息