当前位置: 首页 > news >正文

判断HiveQL语句为建表语句的识别函数

写一个HiveQL建表语句的识别函数,同时实现C#字符串解析程序代码的以下三段逻辑,写在一个函数里,优化以下算法的效率,给出所有情况下的测试用例:
1.从前到后一个一个读取字符,遇到匹配空格、Tab和换行符就继续读取下一个字符,遇到大写或小写的字符c,就读取后一个字符并匹配是否为大写或小写的字符r,以此类推,匹配任意字符大写或小写的create字符串,接着匹配空格、Tab和换行符,然后遇到匹配空格、Tab和换行符就继续读取下一个字符,如果匹配大写或小写的字符t,就读取后一个字符并匹配是否为大写或小写的字符a,以此类推,匹配任意字符大写或小写的table字符串,接着匹配空格、Tab和换行符,将这段逻辑封装为函数,全部匹配完成就返回true,否则返回false,外传参数is_external设置为false,外传参数is_temporary设置为false。
2.从前到后一个一个读取字符,遇到匹配空格、Tab和换行符就继续读取下一个字符,遇到大写或小写的字符c,就读取后一个字符并匹配是否为大写或小写的字符r,以此类推,匹配任意字符大写或小写的create字符串,接着匹配空格、Tab和换行符,然后遇到匹配空格、Tab和换行符就继续读取下一个字符,如果匹配大写或小写的字符e,就读取后一个字符并匹配是否为大写或小写的字符x,以此类推,匹配任意字符大写或小写的external字符串,接着匹配空格、Tab和换行符,然后遇到匹配空格、Tab和换行符就继续读取下一个字符,如果匹配大写或小写的字符t,就读取后一个字符并匹配是否为大写或小写的字符a,以此类推,匹配任意字符大写或小写的table字符串,接着匹配空格、Tab和换行符,将这段逻辑封装为函数,全部匹配完成就返回true,否则返回false,外传参数is_external设置为true,外传参数is_temporary设置为false。
3.从前到后一个一个读取字符,遇到匹配空格、Tab和换行符就继续读取下一个字符,遇到大写或小写的字符c,就读取后一个字符并匹配是否为大写或小写的字符r,以此类推,匹配任意字符大写或小写的create字符串,接着匹配空格、Tab和换行符,然后遇到匹配空格、Tab和换行符就继续读取下一个字符,如果匹配大写或小写的字符t,就读取后一个字符并匹配是否为大写或小写的字符e,以此类推,匹配任意字符大写或小写的temporary字符串,接着匹配空格、Tab和换行符,然后遇到匹配空格、Tab和换行符就继续读取下一个字符,如果匹配大写或小写的字符t,就读取后一个字符并匹配是否为大写或小写的字符a,以此类推,匹配任意字符大写或小写的table字符串,接着匹配空格、Tab和换行符,将这段逻辑封装为函数,全部匹配完成就返回true,否则返回false,外传参数is_external设置为false,外传参数is_temporary设置为true。

以下是实现要求的C#代码及测试用例:

public class HiveQLParser
{
    public static bool ParseCreateTableStatement(string input, out bool isExternal, out bool isTemporary)
    {
        isExternal = false;
        isTemporary = false;
        int index = 0;

        if (!MatchWhitespaceAndKeyword(ref input, ref index, "CREATE")) return false;
        if (!MatchOptionalClause(ref input, ref index, ref isExternal, ref isTemporary)) return false;
        if (!MatchWhitespaceAndKeyword(ref input, ref index, "TABLE")) return false;

        // 检查是否还有剩余非空白内容
        return index < input.Length && IsWhitespace(input[index]);
    }

    private static bool MatchOptionalClause(ref string input, ref int index, ref bool isExternal, ref bool isTemporary)
    {
        int savedIndex = index;
        
        // 尝试匹配EXTERNAL
        if (MatchWhitespaceAndKeyword(ref input, ref index, "EXTERNAL"))
        {
            isExternal = true;
            return true;
        }
        
        // 尝试匹配TEMPORARY
        index = savedIndex;
        if (MatchWhitespaceAndKeyword(ref input, ref index, "TEMPORARY"))
        {
            isTemporary = true;
            return true;
        }

        // 直接匹配TABLE的情况
        index = savedIndex;
        return true;
    }

    private static bool MatchWhitespaceAndKeyword(ref string input, ref int index, string keyword)
    {
        // 跳过空白
        while (index < input.Length && IsWhitespace(input[index])) index++;
        return MatchKeyword(ref input, ref index, keyword);
    }

    private static bool MatchKeyword(ref string input, ref int index, string keyword)
    {
        if (index + keyword.Length > input.Length) return false;

        for (int i = 0; i < keyword.Length; i++)
        {
            if (char.ToUpperInvariant(input[index + i]) != char.ToUpperInvariant(keyword[i]))
                return false;
        }

        index += keyword.Length;
        return true;
    }

    private static bool IsWhitespace(char c) => c == ' ' || c == '\t' || c == '\n' || c == '\r';
}

// 测试用例
public class Program
{
    public static void Main()
    {
        TestCase("CREATE TABLE", false, false);
        TestCase("create external table", true, false);
        TestCase("CREATE TEMPORARY TABLE", false, true);
        TestCase("\tCREATE\nTABLE ", false, false);
        TestCase("CREATE\tEXTERNAL\nTABLE", true, false);
        TestCase("CREATE  TEMPORARY  TABLE", false, true);
        TestCase("CREAT TABLE", false, false);          // 拼写错误
        TestCase("CREATE TABLEX", false, false);        // 多余字符
        TestCase("CREATE EXTERNAL TEMPORARY TABLE", false, false); // 多重修饰
        TestCase("CREATE EXTERN TABLE", false, false); // 拼写错误
        TestCase("", false, false);                    // 空输入
        TestCase("CREATE", false, false);               // 不完整输入
    }

    private static void TestCase(string input, bool expectedExternal, bool expectedTemporary)
    {
        bool result = HiveQLParser.ParseCreateTableStatement(
            input,
            out bool actualExternal,
            out bool actualTemporary
        );

        Console.WriteLine($"Input: [{input}]");
        Console.WriteLine($"Result: {result}, External: {actualExternal}, Temporary: {actualTemporary}");
        Console.WriteLine($"Test {(result && actualExternal == expectedExternal && actualTemporary == expectedTemporary ? "PASSED" : "FAILED")}");
        Console.WriteLine(new string('-', 60));
    }
}

代码说明:

  1. 使用状态机模式进行顺序匹配
  2. 通过引用传递index来跟踪解析位置
  3. 支持大小写不敏感的匹配
  4. 自动跳过任意数量的空白字符(空格、Tab、换行)
  5. 时间复杂度O(n),空间复杂度O(1)

优化点:

  1. 采用索引追踪代替字符串截取操作
  2. 使用字符级比较代替正则表达式
  3. 提前终止失败路径
  4. 共享空白跳过逻辑
  5. 支持任意顺序的空白字符组合

测试用例覆盖范围:

  1. 标准格式(全大写)
  2. 混合大小写格式
  3. 包含多种空白字符
  4. 边界情况(空字符串、不完整输入)
  5. 错误情况(拼写错误、多余字符)
  6. 特殊格式(前后置空白、连续空白)

该实现可以正确处理以下类型的输入:

  • “CREATE TABLE”
  • “create table”
  • “CREATE EXTERNAL\tTABLE”
  • “\nCREATE\nTEMPORARY\nTABLE”
  • “CrEaTe TaBlE”

并能够准确识别:普通表、外部表和临时表三种类型,同时拒绝不符合格式的输入。


文章转载自:
http://bogged.jopebe.cn
http://chemicophysical.jopebe.cn
http://auricle.jopebe.cn
http://bushelage.jopebe.cn
http://cantankerous.jopebe.cn
http://allonym.jopebe.cn
http://adams.jopebe.cn
http://accutron.jopebe.cn
http://ado.jopebe.cn
http://bangkok.jopebe.cn
http://aedicula.jopebe.cn
http://charitarian.jopebe.cn
http://austin.jopebe.cn
http://chryselephantine.jopebe.cn
http://blende.jopebe.cn
http://adventurously.jopebe.cn
http://bulgaria.jopebe.cn
http://avitrice.jopebe.cn
http://calefy.jopebe.cn
http://ceratodus.jopebe.cn
http://bank.jopebe.cn
http://anchorman.jopebe.cn
http://anagrammatize.jopebe.cn
http://bleuderoi.jopebe.cn
http://canicule.jopebe.cn
http://autocorrelation.jopebe.cn
http://biomathematics.jopebe.cn
http://brownie.jopebe.cn
http://arthrodic.jopebe.cn
http://bitterbrush.jopebe.cn
http://www.dtcms.com/a/113890.html

相关文章:

  • 在Spring Boot中配置数据库连接
  • 一个使用nginx转发的cgi程序示例
  • BEVFormer v2(CVPR2023)
  • Airflow量化入门系列:第一章 Airflow 基础与量化交易场景
  • K8S学习之基础七十二:Ingress基于Https代理pod
  • 【LLM】MCP(Python):实现 SSE 通信的 Server 和 Client
  • NO.66十六届蓝桥杯备战|基础算法-贪心-区间问题|凌乱的yyy|Rader Installation|Sunscreen|牛栏预定(C++)
  • 一键自动备份:数据安全的双重保障
  • Linux网络:数据链路层以太网
  • 6.第二阶段x64游戏实战-分析人物状态
  • MySQL:表的约束
  • Windows 10/11系统优化工具
  • 基于Spark的招聘数据预测分析推荐系统
  • Golang的Web框架比较与选择
  • 26.[MRCTF2020]Transform 1
  • 构建macOS命令速查手册:基于Flask的轻量级Web应用实践
  • 代码随想录算法训练营第三十八天 | 322.零钱兑换 279.完全平方数 139.单词拆分
  • 关于HikariDataSource (null)的误解,顺带提出一种mybaits-Plus mapper映射失败的容易被忽视的原因
  • 用swift playground写个ios应用和大模型或者网站交互
  • 日本汽车规模性经济计划失败,日产三大品牌的合并合作共赢,还是绝地求生?本田与日产合并确认失败,将成为世界第三大汽车集团愿景失败
  • 如何绕过myabtis-plus的逻辑删除条件
  • Unity URP管线与HDRP管线对比
  • Mysql 数据库编程技术01
  • Linux上位机开发实践(硬件设计的创新)
  • SQL Server 2022 数据同步到 Elasticsearch 思考
  • Spring 核心技术解析【纯干货版】- XV:Spring 网络模块 Spring-Web 模块精讲
  • 16.1Linux自带的LED灯驱动实验(知识)_csdn
  • [3.2] 深入了解recv参数列表里的status
  • 信息系统项目管理中各个知识领域的概要描述及其管理流程
  • 【网络安全】 防火墙技术