正则表达式删除嵌套的多行注释

时间:2019-04-10 09:02:04

标签: javascript regex

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

请查看此链接

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

当有嵌套的多行注释时,则正则表达式将无法正常工作。该情况已在链接中提及

关于堆栈溢出的这个问题,我已经遍历了多个链接。\ _(ツ)_ /

Regex to find sql comments

Regular expression to remove comments from SQL statement

还有许多其他

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

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

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

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

您实质上是在寻找/**/之间的平衡组,但不幸的是Javascript不支持递归模式。或者,您可以尝试匹配/*,然后匹配*/,中间不插入/**/,然后连续替换为空字符串:

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);

答案 1 :(得分:0)

要从SQL中删除所有类型的注释,请参见pg-minify

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