题目描述
请根据给出的正则表达式来验证邮箱格式是否合法,如果用户输入的格式合法则输出「邮箱格式合法」,否则输出「邮箱格式不合法」。正确格式对应的正则表达式"[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+";
输入:
[email protected]
输出:
邮箱格式合法
分析
最容易想到的是正则表达式库,直接解决,当然也是开发中采用的方法。
作为算法题目、算法学习来说,我们可以采取一个常用的算法,有限状态机。
采用这个算法可以让我逻辑清晰的判断一个字符串是否符合某规范,缺点是代码量多。
不过能帮助我们写出来逻辑正确的算法,绝对是一种良好的思想。
算法背景
有限状态机(FSM)算法是一种数学模型,用于描述系统在一系列状态之间的转换。它由一组状态、输入事件和输出事件组成。FSM算法的特点如下:
确定性:FSM算法在给定输入的情况下,总是按照相同的顺序执行状态转换。这意味着FSM算法是确定性的,即对于相同的输入,总是产生相同的输出。
有向性:FSM算法中的每个状态转换都有明确的方向,即只能从当前状态转换到下一个状态。这使得FSM算法能够有效地处理复杂的问题,同时避免了无限循环的可能性。
存储简单:FSM算法只需要存储当前状态和一组转换规则,因此其存储需求相对较小。这使得FSM算法适用于资源受限的场合。
可扩展性:FSM算法可以通过添加新的状态和转换规则来扩展,以处理更复杂的问题。这使得FSM算法具有很好的可扩展性。
易于理解和实现:FSM算法的结构简单,易于理解和实现。这使得FSM算法适用于各种领域的问题求解。
有限状态机算法解决的问题包括:
序列检测:FSM算法可以用于检测一个序列是否满足特定的条件,如检测一个字符串是否为有效的日期、检测一个数字序列是否为素数等。
模式识别:FSM算法可以用于识别文本、图像或其他数据中的特定模式,如识别电子邮件地址、识别手写数字等。
控制逻辑:FSM算法可以用于实现简单的控制逻辑,如电梯的上下控制、家庭的照明系统控制等。
计算机硬件控制:FSM算法可以用于实现计算机硬件的控制,如键盘、鼠标等外设的控制。
游戏AI:FSM算法可以用于实现简单的游戏AI,如棋类游戏、迷宫游戏等。
代码
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
static boolean checkCharType(char c){
if(c>='a'&&c<='z' || c>='A'&&c<='Z' || c>='0'&&c<='9'){
return true;
}else{
return false;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
String emailMatcher="[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+";
// //write your code here......
// Pattern pattern=Pattern.compile(emailMatcher);
// if(pattern.matcher(str).matches()){
// System.out.println("邮箱格式合法");
// }else{
// System.out.println("邮箱格式不合法");
// }
/*
0:初始
1:123123
2:@
3:nowcoder
4: .
5: com
*/
int status=0;
for(int i=0;i<str.length();++i){
char c=str.charAt(i);
if(status==0){
if(checkCharType(c)){
status=1;
}else{
break;
}
}else if(status==1){
if(checkCharType(c)){
continue;
}else if(c=='@'){
status=2;
}else{
break;
}
}else if(status==2){
if(checkCharType(c)){
status=3;
}else{
break;
}
}else if(status==3){
if(checkCharType(c)){
continue;
}else if(c=='.'){
status=4;
}else{
break;
}
}else if(status==4){
if(checkCharType(c)){
status=5;
}else{
break;
}
}else if(status==5){
if(checkCharType(c)){
continue;
}else{
status=-1;
break;
}
}
}
if(status==5){
System.out.println("邮箱格式合法");
}else{
System.out.println("邮箱格式不合法");
}
}
}