判断是否是合法邮箱
前言
在Java学习过程中,想必一定会有字符串的学习,其中关于字符串的一些内置函数就有很多,像我这种初学者就很头疼。
类似于charAt()函数、replace()函数这些简单的倒还可以理解,像toUpperCase()函数针对的数据类型是字符串,当实现某字符串中的某一个小写字母转大写时,通过charAt()函数定位到的数据类型又是char字符类型,为实现最终目的还需将char转为String。
当然,这与这篇博客其实不相干,但我解决邮箱的思路和小写转大写的思路其实是一样的,需要一步一个脚印,每一段代码你都得知晓是什么意思。
解决思路
首先这道题是在学校oj平台遇到的。
看一下题目:
输入一个字符串,判断是否是合法邮箱(格式正确即可,不管是否真的存在)输入的只能是字母、数字、下划线、@以及.五种, @前后只能是字母或者数字,而且.后只能是com, 是则输出YES ,否则输出NO
这道题的标准解法是正则表达式。
哦豁,完蛋,老师没咋细讲(其实是我没听)
我的解决思想是每一个条件都符合才输出YES,只要有一个条件不符合输出NO。
这种思想类似防火墙的安全策略,只要你的条件不符合,这条数据流量就不给过。
那都有什么条件呢?
条件1:输入的只能是字母、数字、下划线、@以及.五种
条件2:@前后只能是字母或者数字
隐藏条件:必须含@,不然非法格式
条件3:.后只能是com
隐藏条件:必须含.,且字符串后四位为.com
可以嗷,思路出来了。
条件可以用方法体实现,一个条件一个方法体。
可以考虑bool函数,但是我失败了,我太菜了
所以我考虑当这个条件符合,就赋予计数器数值为特定值
在主函数用if函数判断返回值是否为特定值判断条件是否符合
代码实现
这是条件1,当条件符合,返回count数值为1。
public static int tj1(String str1){
int count=0;
for(int i=0;i<str1.length();i++){
if(str1.charAt(i)>='a'&&str1.charAt(i)<='z'
||str1.charAt(i)>='A'&&str1.charAt(i)<='Z'
||str1.charAt(i)>='0'&&str1.charAt(i)<='9'
||str1.charAt(i)=='_'
||str1.charAt(i)=='@'
||str1.charAt(i)=='.'){
count=1;
}
else{
count=2;
break;
}
}
return count;
}
这是条件2,包含隐含条件
当隐含条件符合后,count=1
只有count=1才能执行whlie函数
当while函数里条件符合,返回count数值为3
也就是说,这个条件的返回值只有是3才符合条件,1和2不行
public static int tj2(String str1){
int count = 0;
for(int i=0;i<str1.length();i++){
if(str1.charAt(i)=='@'){
count=1;
}
}
while(count==1){
int i=str1.indexOf('@');
if(((str1.charAt(i-1)>='a'&&str1.charAt(i-1)<='z')
||(str1.charAt(i-1)>='A'&&str1.charAt(i-1)<='Z')
||(str1.charAt(i-1)>='0'&&str1.charAt(i-1)<='9'))
&&((str1.charAt(i+1)>='a'&&str1.charAt(i+1)<='z')
||(str1.charAt(i+1)>='A'&&str1.charAt(i+1)<='Z')
||(str1.charAt(i+1)>='0'&&str1.charAt(i+1)<='9'))){
count=3;
}
else{
count=2;
}
}
return count;
}
这是条件3,当条件符合,返回count数值为1。
public static int tj3(String str1){
int count=0;
if(str1.charAt(str1.length()-4)=='.'
&&str1.charAt(str1.length()-3)=='c'
&&str1.charAt(str1.length()-2)=='o'
&&str1.charAt(str1.length()-1)=='m'){
count=1;
}
else{
count=2;
}
return count;
}
这是主函数,只有三个方法的返回值分别为1,3,1时,
这个邮箱格式才合法。
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
int jg1=tj1(str);
int jg2=tj2(str);
int jg3=tj3(str);
if(jg1==1&&jg2==3&&jg3==1){
System.out.println("YES");
}
else{
System.out.println("NO");
}
scan.close();
}
———————————————————————————
总结
虽然这比正则表达式复杂一点,但我觉得比正则表达式通俗易懂嘿嘿嘿。
其次这个方法的思想结构很清晰,条条框框很清楚,很适合锻炼编程思想。
但我可不推荐考试的时候用这个方法,本来这个就是考正则表达式这个知识点的。
值得注意的是写条件里的&&和||时,一定要小心谨慎,必要时加上括号。
代码可别忘了加
import java.util.*;
public class Main {}