Java使用有限状态机算法实现判断字符串是否合法

2023-11-14

题目描述

请根据给出的正则表达式来验证邮箱格式是否合法,如果用户输入的格式合法则输出「邮箱格式合法」,否则输出「邮箱格式不合法」。正确格式对应的正则表达式"[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+";
输入:
123123@nowcoder.com
输出:
邮箱格式合法

分析

最容易想到的是正则表达式库,直接解决,当然也是开发中采用的方法。
作为算法题目、算法学习来说,我们可以采取一个常用的算法,有限状态机
采用这个算法可以让我逻辑清晰的判断一个字符串是否符合某规范,缺点是代码量多。
不过能帮助我们写出来逻辑正确的算法,绝对是一种良好的思想。

算法背景

有限状态机(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("邮箱格式不合法");
        }

    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java使用有限状态机算法实现判断字符串是否合法 的相关文章

  • 这两个绑定声明与 Google Guice 有什么区别?

    有什么区别 bind FooImpl class in Scopes SINGLETON bind Foo class to FooImpl class and bind Foo class to FooImpl class in Scop
  • 在 IntelliJ 插件中创建后台任务

    我正在开发一个 IntelliJ idea 插件 并希望在后台任务中运行代码 在后台任务对话框和 UI 之外的另一个线程中可见 我发现了以下内容助手类 https github com inmite android selector cha
  • Java中printf左对齐

    当我运行该程序时 阶乘值右对齐 有没有办法让它左对齐 同时保持中间 50 个空格 public class Exercise 5 13 public static void main String args int numbers 1 2
  • 具有多字符替换的字符串组合(产生返回Java的替代重写)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 还有另一篇 Stack Overflow 帖子是为与车辆登记号相关的算法创建的 根据输入的车牌 例如ABC123 和列表 替换值 例如
  • Hamcrest 与 MockMvc:检查键是否存在,但值可能为空

    我正在使用 MockMvc 进行一些测试 我想验证 JSON 响应的结构 具体来说 我想确保属性的键存在 并且值是某种类型或为 null keyToNull null This may be null or a String keyToSt
  • TestNG 与 DataProvider 并行执行

    我有一个从数据提供者接收数据的测试 我希望此测试与数据提供者的不同值并行运行 我尝试了这样的方法 public class IndependentTest Test dataProvider dp1 threadPoolSize 3 inv
  • 将一组 Java 对象转换为另一组对象的最佳方式是什么?

    这是一个真正的新手提出的基本 Java 问题 我有一组实现某个接口 接口 MyIfc 的Java对象 属于 MyClass 类 我有一组这些对象存储在我的类中的私有变量中 声明如下 protected Set
  • 为什么 JPA/hibernate 不能映射到 MySQL blob 类型?

    我收到以下错误 Caused by org hibernate HibernateException Wrong column type in TestTable for column PAYLOAD Found blob expected
  • 0x0A 和 0x0D 之间的区别

    我正在研究蓝牙 我试图编写代码以在连接时继续监听输入流 我遇到了以下代码片段 int data mmInStream read if data 0x0A else if data 0x0D buffer new byte arr byte
  • JPA Criteria API 任意数量的联接/子查询

    我需要使用以下实体构建相交类型查询 为了清楚起见 减少了实体 Entity and other stuff public class Member Id private Long id private String name Entity
  • 强制预先加载原本延迟加载的属性

    我有一个 Hibernate 对象 它的属性都是惰性加载的 大多数这些属性是其他 Hibernate 对象或 PersistentSet 现在我想强制 Hibernate 一次性加载这些属性 当然 我可以 触摸 这些属性中的每一个objec
  • 如何反序列化数组 google-gson 内的数组

    我有这样的 JSON Answers Locale Ru Name Name1 Locale En Name Name2 Locale Ru Name Name3 Locale En Name Name4 正如你所看到的 我的数组里面有数组
  • 什么触发了java垃圾收集器

    我对 Java 中垃圾收集的工作原理有点困惑 我知道当不再有对某个对象的实时引用时 该对象就有资格进行垃圾回收 但是如果它有对实时对象的引用怎么办 可以说我有一个节点集合 它们再次引用更多节点 List 1 gt Node a gt Nod
  • “该选择不能在任何服务器上运行”

    我一直在 Eclipse 中开发一个动态 Web 项目 我收到这个错误 该选择不能在任何服务器上运行 早些时候它工作得很好 但现在我收到了这个错误 我删除了服务器并再次添加 Project gt Right Click gt Propert
  • 为什么这个 eclipse 错误显示以及它的解决方案应该是什么

    缺少库 xdoclet 1 2 1 jar 选择 XDoclet 的主目录 1 2 1 为什么这个 eclipse 错误显示以及它的解决方案应该是什么alz 这可能是因为该 jar 没有添加到您的项目构建路径中 请按照以下步骤操作 Righ
  • 如何在 Java 中以编程方式获取接口的所有实现的列表?

    我可以通过反思或类似的方式来做到这一点吗 我已经搜索了一段时间 似乎有不同的方法 这里总结一下 反思 https github com ronmamo reflections如果您不介意添加依赖项 该库非常受欢迎 它看起来像这样 Refle
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • GWT 和身份验证

    保护 GWT Tomcat 应用程序执行身份验证和授权的最佳策略是什么 有两种基本策略 确保入口点安全 确保远程服务的安全 确保入口点安全 最简单的方法是使用常规 Web 应用程序安全工具限制对 GWT 生成的 html js 文件的访问
  • 返回数据集的 kSoap 和 .Net Web 服务

    我知道使用数据集是一个很大的罪恶 但由于该服务不在我的控制之下 并且创建代理服务的前景是不可能的 我想看看是否有人创建了可以使用 kSoap 序列化器反序列化的类结构 或者我是否吸错了东西 同时要启动它 看看是否可行 以下是预期的结果数据
  • 优化Gson反序列化

    优化反序列化的最佳方法是什么 我目前正在使用标准 Gson toJson 和 Gson fromJson 方法来序列化和反序列化一些复杂对象 我希望尽可能减少反序列化时间 如果重要的话 我的最复杂的对象包含 43 个变量 如果你想使用 Gs

随机推荐

  • 二分法,平衡二叉树、B树、B+树

    二分法 平衡二叉树 B树 B 树 二分法 二分法查找 算法要求 比较次数 二分法到二叉树 平衡二叉树 平衡二叉树概念 平衡二叉树的构建规则 平衡二叉树特点 B树 B tree B树的构建规则 B树的查询流程 B 树 B 树构建规则 B 树和
  • 【华为OD机试 2023】货币单位换算(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • 成功解决Win7 64位系统下GraphEdit 不能显示Directshow.net远程图表的问题

    首先问题如题 我是Win7 64位旗舰版操作系统 VS2010 使用Directshow net开发播放器程序 结果发现通过以前使用的GraphEdit无论如何不能看到远程图表 不管是重新注册spy dll PropPage dll等文件
  • 倒沖法-線邊倉

    倒冲法 倒冲法 Back flush 目录 隐藏 1 倒冲法概述 2 倒冲法的应用 3 倒冲法的隐性会计处理 1 4 倒冲错误的产生原因及处理程序 1 5 参考文献 编辑 倒冲法概述 倒冲法 Back flush 是ERP系统根据产成品收料
  • git错误 error: failed to push some refs to ‘https://github.com/...

    1 解决办法 git错误 error failed to push some refs to https github com 问题原因 远程库与本地库不一致造成的 在hint中也有提示把远程库同步到本地库就可以了 解决办法 使用命令行 g
  • Orange pi3 LTS Ubuntu22.04通过源码编译的方式安装opencv(C++版)

    硬件 orangepi 3 LTS 之前安装opencv的时候遇到了很多奇奇怪怪的错误 所以干脆重新写入系统后开始安装 安装Ubuntu22 04的过程按照官方提供的用户手册来操做 官方用户手册下载链接 http www orangepi
  • C++基础知识 - explicit 关键字

    explicit 关键字 作用是表明该构造函数是显示的 而非隐式的 不能进行隐式转换 跟它相对应的另一个关键字是implicit 意思是隐藏的 类构造函数默认情况下即声明为implicit 隐式 include
  • Ansible自动化运维工具学习-第二天

    Ansible入门学 第二天 前言 亲爱的小伙伴 如果你已经阅读了博主的Ansible 第一天相信你应该对Ansible有了一定的了解 不知道关于如何利用Ansible实现集群归档备份你有没有学会呢 今天暂且不谈Ansible的各个模块 因
  • Neo4j 数据导入导出

    前提条件 切换至neo4j 安装目录的bin 文件夹 D neo4j neo4j community 3 4 6 bin 或者配置全局环境变量 执行数据导出命令 neo4j admin dump database graph db to s
  • [Vue warn]: Cannot find element: #app

    解决方案 js在html页面头部引入的原因 自定义js文件要最后引入 因为要先有元素id vue才能获取相应的元素
  • 消息队列中间件 - Docker安装RabbitMQ、AMQP协议、和主要角色

    概述 不管是微服务还是分布式的系统架构中 消息队列中间件都是不可缺少的一个重要环节 主流的消息队列中间件有RabbitMQ RocketMQ等等 从这篇开始详细介绍以RabbitMQ为代表的消息队列中间件 AMQP协议 AMQP协议是一个提
  • Python使用plot()函数画图进阶使用

    目录 使用介绍 plot 函数进阶使用 1 全局信息代码 2 绘图代码 1 画布设置 2 函数传入参数设置 3 函数内部代码解读 4 函数调用 5 plt tight layout 函数的使用 6 最后做出图形如下 使用介绍 在前文 Pyt
  • 读书:《素书新解》(一)

    黄石公的 素书 分六章 原始 正道 求人之志 本德宗道 遵义 安礼 共132句 1636字 夫道 德 仁 义 礼 五者一体也 我问了一下ChatGPT 给出五者的更详细的解释 道 德 仁 义 礼是中国传统文化中的重要概念 它们代表了人们追求
  • 多线程 并发编程与异步方法

    1 Parallel Programming中的PLINQ Parallel Class与Task Parallelism的特点 并发编程的内容类似于Google的Map Reduce的算法 多线程的着眼点是线程的互斥 同步等 而并行编程的
  • c++语言常量,C++常量(constant)

    在程序执行过程中 其值不能改变的量称为常量 Constant 普通常量的类型是根据数据的书写形式来决定的 如 100 是整型常量 0 5 是实型常量 q 是字符型常量 qianfeng 是字符串常量 1 整型常量 在 C 中 使用的整型常量
  • 计算机网络体系结构2

    1 计算机网络体系结构 由 网络协议 构成 规定了所交换的数据的格式 规定了所交换的数据的时序 数据内容所表示的含义等方面的内容 2 网络协议三要素 语法 数据与控制信息的结构或格式 语义 需要发出何种控制信息 完成何种动作以及做出何种响应
  • 703n无法进入路由管理界面reset无效重刷方法

    现在没法接网线获取不到地址 winscp也登不了 请问除了ttl线外不拆机能重刷吗 安全模式恢复 具体方法如下 网线连接电脑和703n 设置电脑ip地址为192 168 1 2 掩码默认 网关192 168 1 1 电脑 gt 开始 gt
  • 沐风老师3DMAX厨房橱柜生成器KitchenCabinetGenerator教程

    3DMAX厨房橱柜生成器插件使用方法 3DMAX橱柜生成器KitchenCabinetGenerator是一个在3dMax中自动创建三维橱柜模型的高效脚本 它有多种风格的台面 门和橱柜 可以灵活地应用于Archviz项目 同时为3D艺术家节
  • 分支算法应用2--快速排序

    快速排序 快速排序就是将一个需要排序的数组A a0 a n 1 顺序排列输出 首先从数组中随便找到一个元素x 然后将小于这个元素x的所有元素放到这个元素左边 将大于这个元素x的所有元素放到这个元素的右边 最后运用递归再对x左边和右边的元素进
  • Java使用有限状态机算法实现判断字符串是否合法

    题目描述 请根据给出的正则表达式来验证邮箱格式是否合法 如果用户输入的格式合法则输出 邮箱格式合法 否则输出 邮箱格式不合法 正确格式对应的正则表达式 a zA Z0 9 a zA Z0 9 a zA Z0 9 输入 123123 nowc