提问人:XXDIL 提问时间:3/24/2023 最后编辑:Wiktor StribiżewXXDIL 更新时间:4/1/2023 访问量:146
从 SQL/PLSQL 块中删除注释
Remove comments from SQL/PLSQL blocks
问:
我一直在寻找一种从 SQL/PLSQL 块中删除注释的方法。 它应遵循以下标准:
- 应删除单行注释 (--)。
- 应删除多行注释 (/**/)。
- 但最重要的是,如果这些注释位于字符串(单引号或双引号)中,则应忽略它们。
我已经尝试了几个正则表达式,但没有一个能够捕获我需要的东西。 例如:
--(?!.*(['""])[^'""]*\1)[^'\n\r]*
->单行注释(''.*?''|".*?")|/\*.*?\*/|--.*?(?=$|\Z)
->适用于所有情况
我从这里找到的第二个正则表达式,这并不适用于所有情况。
有人可以在 c# 正则表达式引擎中使用正则表达式提供示例吗?
PS : 我应该使用正则表达式匹配方法吗?
答:
0赞
NetMage
3/25/2023
#1
假设多行注释可能未嵌套,您可以分四个步骤继续。
首先,将带引号(单行或双引号)的字符串中的任何换行符替换为输入中找不到的特殊字符模式。据我所知,PL/SQL 或 SQL*Plus 不支持特殊的转义字符,所以我选择作为替代品。\!
var deNLquoted = Regex.Replace(src, @"('[^']*'|""[^""]*"")", m => m.Value.Replace("\n", @"\!"));
然后,从行首(包括任何带引号的字符串)进行匹配,然后将单行注释标记与行尾匹配。替换为不带单行注释的匹配项:
var deSingleLineComment = Regex.Replace(deNLquoted, @"^((?:'[^'\n]*'|""[^""\n]*""|[^'""]+?)*?)--.*$", "$1", RegexOptions.Multiline|RegexOptions.NonBacktracking);
然后,从行首开始匹配,包括任何带引号的字符串,然后匹配多行注释。替换为不带多行注释的匹配项:
var deMultilineComment = Regex.Replace(deSingleLineComment, @"((?:'[^']*'|""[^""]*""|[^'""\n]+?)*?)/\*([^*]|\*[^/])*?\*/", "$1", RegexOptions.Multiline|RegexOptions.NonBacktracking);
最后,删除删除整个注释行时留下的任何空行,然后将取消注释的字符串中的换行符标记转换回换行符。
var ans = deMultilineComment.Replace("\n\n", "\n").Replace(@"\!", "\n");
评论
0赞
XXDIL
3/25/2023
感谢您的解决方案,但引号中可以有新行。
0赞
NetMage
3/28/2023
@XXDIL 出于好奇,您支持哪种类型的 SQL 允许换行符?例如,对于 T-SQL,可以在处理注释之前删除任何注释。\\\n
0赞
XXDIL
3/28/2023
它的 Oracle SQL,该脚本将以文本文件的形式出现,一个文件中包含多个命令。每个命令不必在一行中。
0赞
NetMage
3/28/2023
@XXDIL 代码可以很好地处理命令中的换行符 - 它只是假设引号之间没有换行符 - 是否可以将带引号的字符串拆分为多行?
0赞
XXDIL
3/29/2023
是的,确切地说,一个带引号的字符串可以包含多行。例如,str =select 'multi\nline\nstring' from dual;
评论
('[^']*')*.*(-{2}.*)
最后一组捕获内联注释(仅检查单引号,但应该易于扩展)。也不处理转义引号。'-- comment 2'