【问题标题】:Regex to remove nested multi line comment正则表达式删除嵌套的多行注释
【发布时间】:2019-08-31 16:20:41
【问题描述】:

我正在尝试从 javascript 中的 SQL 字符串中删除所有 cmets。我有这个正则表达式,它几乎删除了所有这些,但有一个问题。

请查看此链接

https://regex101.com/r/JaEWKO/1

当存在嵌套的多行 cmets 时,正则表达式无法按预期工作。该方案已在链接中提到

我已经在 stackoverflow 上浏览了多个关于这个问题的链接¯\_(ツ)_/¯

Regex to find sql comments

Regular expression to remove comments from SQL statement

还有很多其他

这是我当前使用的正则表达式

var sql = storedProc.replace(/(--.*)|(((\/\*)+?[\w\W]+?(\*\/)+))/g, '')

我希望它从字符串中删除所有注释,但在嵌套多行 cmets 的情况下它会中断。

谁能帮我解决这个问题?

【问题讨论】:

  • 你的意思是这样的:(?:--.*)|(?:\/\*)+?[\w\W]+?\n\*\/regex101.com/r/OQIFM4/1
  • @Thefourthbird 只是这个问题。看到这个链接regex101.com/r/JaEWKO/2
  • Please have a look on this link https://regex101.com/r/JaEWKO/1 PCRE (PHP) 正则表达式与 javascript 有什么关系?
  • @JaromandaX 对不起,我忘了更改“风味”:)
  • while (/\/\*[^\/*]*(?:\/(?!\*)[^\/*]*|\*(?!\/)[^\/*]*)*\*\//.test(s)) { s = s.replace(/\/\*[^\/*]*(?:\/(?!\*)[^\/*]*|\*(?!\/)[^\/*]*)*\*\//g, ''); }(见demo

标签: javascript regex


【解决方案1】:

您实际上是在寻找/**/ 的平衡组,但不幸的是,Javascript 不支持递归模式。作为替代方案,您可以尝试匹配/*s 后跟*/s,中间没有/**/s,并不断替换为空字符串:

const str = `--GO
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO

something which is not a comment

/*
    DECLARE @Gas SMALLDATETIME = '1/1/2016',
            @System              VARCHAR(Max) = '30',--'12,76,466,465,30,226',
            /*following param is to help decide Transportation or Storage */
            @Contract         INT = 0,--Transport or (1 = storage). 
            /*following param is to help decide dth or %*/
            -- Contract Period 0 = 5 Years, 1 = 10 years,..., 4=25 years
            
*/`;
let intermed = str.replace(/--.*\n?/g, '');
let match;
while (match = intermed.match(/(?:\/\*)+(?:(?!\*\/|\/\*)[\w\W])+(?:\*\/)+/)) {
  intermed = intermed.replace(match[0], '');
}
console.log(intermed);

【讨论】:

  • 在这种情况下,经过调和的贪婪令牌可能会导致长 cmets 显着减速。我建议展开它,请参阅my comment。无论如何,它不能保证在 100% 的情况下按预期工作。
  • @WiktorStribiżew “无论如何,它不能保证在 100% 的情况下按预期工作”你能详细说明在哪种情况下它会失败吗?
  • @MuhammadOmer 见regex101.com/r/cWCVO8/1。如果/**/ 出现在字符串中,则正则表达式将与预期的字符串不匹配。
  • /* /*以下参数用于帮助决定运输或存储 */ @Contract INT = 0,--运输或(1 = 存储)。 /*以下参数用于帮助决定 dth 或 % -- 合同期限 0 = 5 年,1 = 10 年,...,4=25 年 */ 这是 SSMS 中的有效注释,但它不起作用使用提供的正则表达式。如果无法通过正则表达式实现,我应该使用任何解析器或其他东西吗?如果是,那么任何人都可以在这方面指导我。
  • @MuhammadOmer /*s 和 */s 在该字符串中不平衡 - 您期望从中得到什么样的输出?
【解决方案2】:

要从 SQL 中删除所有类型的 cmets,请参阅 pg-minify

它适用于 PostgreSQL + MS-SQL + MySQL,而且它可以压缩生成的 SQL。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2012-04-08
    • 1970-01-01
    • 2011-02-14
    • 2011-04-01
    • 2015-02-25
    • 2010-10-13
    • 2014-10-09
    相关资源
    最近更新 更多