正则表达式删除单行 SQL 注释 (--)

2023-12-03

问题:

谁能给我一个可以从 SQL 语句中删除单行注释的有效正则表达式 (C#/VB.NET)?

我的意思是这些评论:

-- This is a comment

不是那些

/* this is a comment */

因为我已经可以处理明星评论了。

我做了一个小解析器,当这些注释位于行首时,它会删除它们,但它们也可能位于代码之后的某个地方,或更糟糕的是,在 SQL 字符串中'hello --Test -- World'这些注释也应该被删除(当然除了 SQL 字符串中的注释 - 如果可能的话)。

令人惊讶的是我没有让正则表达式工作。我本以为明星评论会更难,但实际上并非如此。

根据请求,这里是我删除 /**/ 风格注释的代码 (为了让它忽略 SQL 样式字符串,您必须用唯一标识符替换字符串(我使用了 4 个串联),然后应用注释删除,然后应用字符串反向替换。

    static string RemoveCstyleComments(string strInput) 
    { 
        string strPattern = @"/[*][\w\d\s]+[*]/"; 
        //strPattern = @"/\*.*?\*/"; // Doesn't work 
        //strPattern = "/\\*.*?\\*/"; // Doesn't work 
        //strPattern = @"/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/ "; // Doesn't work 
        //strPattern = @"/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/ "; // Doesn't work 

        // http://stackoverflow.com/questions/462843/improving-fixing-a-regex-for-c-style-block-comments 
        strPattern = @"/\*(?>(?:(?>[^*]+)|\*(?!/))*)\*/";  // Works ! 

        string strOutput = System.Text.RegularExpressions.Regex.Replace(strInput, strPattern, string.Empty, System.Text.RegularExpressions.RegexOptions.Multiline); 
        Console.WriteLine(strOutput); 
        return strOutput; 
    } // End Function RemoveCstyleComments 

我会让你们所有人失望的。这不能用正则表达式来完成。当然,很容易找到不在字符串中的注释(即使是OP也可以做到),真正的问题是字符串中的注释。还有一点点希望环顾四周,但这还不够。告诉你一行中有前面的引用并不能保证任何事情。唯一能保证你有所收获的是引用的奇怪之处。一些你用正则表达式找不到的东西。因此,只需采用非正则表达式方法即可。

EDIT:这是 C# 代码:

        String sql = "--this is a test\r\nselect stuff where substaff like '--this comment should stay' --this should be removed\r\n";
        char[] quotes = { '\'', '"'};
        int newCommentLiteral, lastCommentLiteral = 0;
        while ((newCommentLiteral = sql.IndexOf("--", lastCommentLiteral)) != -1)
        {
            int countQuotes = sql.Substring(lastCommentLiteral, newCommentLiteral - lastCommentLiteral).Split(quotes).Length - 1;
            if (countQuotes % 2 == 0) //this is a comment, since there's an even number of quotes preceding
            {
                int eol = sql.IndexOf("\r\n") + 2;
                if (eol == -1)
                    eol = sql.Length; //no more newline, meaning end of the string
                sql = sql.Remove(newCommentLiteral, eol - newCommentLiteral);
                lastCommentLiteral = newCommentLiteral;
            }
            else //this is within a string, find string ending and moving to it
            {
                int singleQuote = sql.IndexOf("'", newCommentLiteral);
                if (singleQuote == -1)
                    singleQuote = sql.Length;
                int doubleQuote = sql.IndexOf('"', newCommentLiteral);
                if (doubleQuote == -1)
                    doubleQuote = sql.Length;

                lastCommentLiteral = Math.Min(singleQuote, doubleQuote) + 1;

                //instead of finding the end of the string you could simply do += 2 but the program will become slightly slower
            }
        }

        Console.WriteLine(sql);

它的作用是:找到每条评论的字面意思。对于每个内容,通过计算当前匹配项和最后一个匹配项之间的引号数来检查它是否在评论中。如果这个数字是偶数,那么它是一个注释,因此将其删除(找到行的第一个结尾并删除之间的内容)。如果它是奇数,则它在字符串内,找到字符串的末尾并移动到它。 Rgis 片段基于一个奇怪的 SQL 技巧:“this”是一个有效的字符串。即使两个报价不同。如果您的 SQL 语言不适合,您应该尝试完全不同的方法。如果是这样的话,我也会为此编写一个程序,但这个程序更快、更简单。

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

正则表达式删除单行 SQL 注释 (--) 的相关文章

  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • 在不使用 ncurses 的情况下用 C/C++ 编写“真正的”交互式终端程序,例如 vim、htop...

    不 我不想使用ncurses 因为我想了解如何 终端可以工作 并且我自己编程也很有趣 没有 必须是可移植的 它必须只能在基于 linux xterm 的终端仿真器上工作 我想做的是编写一个交互式终端应用程序 例如 htop 和 vim 我的
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • 实用程序库中应包含哪些内容[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着我的项目越来越多 我发现我经常从一个项目到另一个项目 从一个客户到另一个客户重复许多常见的任务 因此 我开始组装一个 实用程序 库 这是这些
  • 本地主机上的 .net HTTP_X_FORWARDED_FOR NULL

    抱歉 如果其他地方已经回答了这个问题 我找不到它 如果没有 我会尝试查找访问过该站点的机器的原始 IP 根据我的基本理解 变量HTTP X FORWARDED FOR无论代理和其他过滤器如何 都会显示用户的 IP 如果这是真的 我正在尝试对
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • C++ 错误:从“char”到“const char*”的转换无效

    我对 C 完全陌生 我创建了这个函数 bool guessWord string compWord cout lt lt Guess a letter string userLetter cin gt gt userLetter for u
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • 获取家庭成员

    假设以下家庭 其构建架构是 create table PersonConn child int parent int insert into PersonConn values 1 2 insert into PersonConn valu
  • 从 exit() 和 fork() 返回的结果奇怪地发生了位移

    我有一个 C 代码 有时会自行分叉 每个分叉都会执行一些操作 然后返回一个错误代码 目前 每个子进程返回其 ID 0 n void other int numero exit numero int main for int i 0 i lt
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 根据表sql中的行替换字符串中的字符

    我需要用一些映射的字符替换字符串中的字符列表 我有一个表 dbo CharacterMappings 有 2 列 CharacterToFilter 和 ReplacementCharacter 假设这个表中有3条记录 Filter Rep
  • 字符串 c 的二叉树

    我正在尝试实现一个能够在 c 中保存字符串的二叉树 在让代码适用于整数之后 我尝试稍微修改它以处理字符数组 现在我似乎完全破解了代码 但不知道如何破解 任何帮助表示赞赏 include
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 获取会议组织者邮件地址 EWS API

    我想使用 EWS API 获取会议组织者的邮件地址 目前 我刚刚获得约会项目的一些属性 我听说你可以设置你想要获取哪些属性 我的代码看起来像这样 CalendarView cview new CalendarView start end c
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • 类模板的 C++ 静态成员 - 链接器警告“多重定义”[重复]

    这个问题在这里已经有答案了 假设出于某种原因 我想要一个类模板 MyTemp 和一些静态数据成员 smDummyVar Mytemp h ifndef MY TEMP H define MY TEMP H template

随机推荐

  • 来自 iframe 本身的 iframe 上的 div

    我有一个 div 包含在外部 html 的 iframe 内 基于 html 的 上下文菜单 需要位于 iframe 之上 但上下文菜单的 html 代码位于 iframe 本身中 首选纯 CSS 解决方案 iframe 的内容无法显示在
  • JpegBitmapEncoder.Save() 在使用元数据写入图像时抛出异常

    我正在构建一个 WPF 桌面应用程序来帮助我组织照片以发布到 Facebook 以下是我在新位置创建照片副本并添加标题 EXIF IPTC XMP 的代码 private void SaveImageAs string currPath s
  • 查找列表中总计达到目标数字的元素

    假设我有一个列表 List
  • 如何动态增加 UITableViewCell 的高度

    我有一个 UITableView 其中包含 UITableViewCells 列表 我在方法中设置了 UITableViewCells 的高度 CGFloat tableView UITableView tableView heightFo
  • 在 Plotly 中悬停/单击时更改整个迹线的颜色

    我在绘图中绘制了当前图形 下面的 jupyter 笔记本代码 并希望创建这样的效果 当您将鼠标悬停或单击每个迹线时 整个迹线将以不同的颜色突出显示 在本例中为红色 我尝试从 SOF 中实现这些示例 Python 中的 Plotly 如何突出
  • 根据泛型类型调度不同的函数

    我想编写一个函数 让我分派传入的泛型类型 我不关心运行时值 只关心编译时类型 const value any const x DateTime parseAs
  • 在 C++ 中以特定间隔速率调用方法

    这真的让我很恼火 因为我以前做过 大约一年前 我一辈子都不记得那是什么图书馆了 基本上 问题是我希望能够以指定的时间间隔调用某个方法一定次数或一定时间段 一个例子是我想从现在开始调用方法 x 10次 每0 5秒一次 或者 从现在开始调用方法
  • 当我们删除一个项目时,字典会调整大小吗?

    在Python中 当我们从字典中删除一个项目时 字典会调整大小还是重建字典表 从一些网站和博客中我了解到 当我们从字典中删除一个项目时 Python会在删除的键中插入一个虚拟键来填充字典条目 稍后 Python将通过调用一些清理函数来清理虚
  • 密钥库类型:使用哪一种?

    通过查看文件java security of my JRE 我看到默认使用的密钥库类型设置为JKS Here 有一个可以使用的密钥库类型的列表 有推荐的密钥库类型吗 不同密钥库类型的优点 缺点是什么 与您链接到的标准名称列表中列出的类型相比
  • 缩放以显示 bing 地图中的所有位置

    假设我有 3 个图钉 1 加利福尼亚州 2 佛罗里达州 3 纽约 为了让这三个人都可见 我必须缩小到足够远才能看到整个国家 但可以说我有 1 加利福尼亚州 2 内华达州 3 德克萨斯州 我必须缩小才能覆盖美国的西南角 Windows Pho
  • Derby 数据库表列名称格式在查询中不一致

    当查询 Derby 数据库时 我发现对于某些表 我必须双引号列名并使用表名来限定列名 但对于其他一些表 我不需要 这些表会发生什么 如何使所有表相同并且可以在没有双引号和表名限定符的情况下查询它们 我正在使用 NetBeans IDE 的
  • d3.js V3 力定向图和未链接的节点

    我正在做我的第一个数据可视化项目 更多的是为了练习 学习 d3 js 因为数据可视化是我感兴趣的 我的第一个项目是制作力向图 该数据集是与其毗邻州相关的 50 个州 源是州 目标是边界州 夏威夷和阿拉斯加没有接壤的州 如果我在 csv 文件
  • 无法在 NetBeans IDE 中建立与 MySQL 的连接

    当我使用 Hibernate 创建新的 Web 项目时 我打开新建连接向导 选择 MySQL 连接器 J 驱动程序 选项 连接器 jar 出现在驱动程序文件列表中 按下一步按钮 设置主机 127 0 0 1 端口 3306 数据库名称 用户
  • 单击时关闭菜单

    我想通过单击链接或单击菜单外部来关闭菜单 为了让事情变得美好和轻松 我不想使用 jQuery 我该怎么做
  • 如果 Int 不能为 null,那么 null.asInstanceOf[Int] 是什么意思?

    作为测试 我写了这段代码 object Ambig extends App def f x Int println Int def f x String println String f null asInstanceOf Int f nu
  • 乳胶打印单斜杠、反斜杠r、反斜杠n

    我希望 tex 文件中的以下行 按原样 打印 while tmp 0 r tmp 0 n tmp 当我将它包装在 verb 命令中时 如下所示 verb while tmp 0 r tmp 0 n tmp 它不起作用 我得到 Undefin
  • MS Access:将参数从一种访问形式传递到另一种访问形式

    我有一个表格和一个按钮 我想通过单击按钮打开另一个表单 并将参数从父表单传递到子表单 子表单的 RecordSource 有参数 我该怎么做 您可以通过引用表单的对象来引用调用表单的任何属性 我不会用 表单属性的符号 我讨厌它 所以如果你想
  • Reportlab - 将两个段落添加到一个表格单元格中

    我有一个表 其构建如下 styleN styles Normal data table row ID Some Information data append table row table row table row append Par
  • 动态添加后突出显示表格行

    看看如何在使用 jquery 动态添加表行后突出显示它 我的代码似乎添加行没有问题 但它没有突出显示正确的行 jquery opponents tr last after tr td data td td more data td tr e
  • 正则表达式删除单行 SQL 注释 (--)

    问题 谁能给我一个可以从 SQL 语句中删除单行注释的有效正则表达式 C VB NET 我的意思是这些评论 This is a comment 不是那些 this is a comment 因为我已经可以处理明星评论了 我做了一个小解析器