2

我不是专家,但我正在尝试编写 .NET 正则表达式来排除 SQL 注释行。不幸的是,我找不到关于如何使用排除组在另一个正则表达式匹配中查找正则表达式匹配的正确描述: ('.*?') 。

此正则表达式查找引号之间的所有文本,但它还包括 SQL 注释区域(/*..*/ 和 --..):

'.*?'

我尝试过的所有东西都没有按我的预期工作。

我的测试样本:

    IF @RetValue = 'Cat'
   /*SET @RetValue = 'WrongLocation
and it works here' */
   ------testing line
SET @Dude = 'Punto'
/* comments */
    -- But it doesn't work here because inside comments! 
    -- and this is aren't the end
    SET @RetValue = 'But this should
work here'

正确的匹配应该只返回这个:

'Cat'
''Punto'
and
'But this should
work here'
4

1 回答 1

0

我找不到一个优雅的正则表达式来一步完成你想要的,但你可以分两步完成。

string commentFree = Regex.Replace(sourceString, @"\/\*.*?\*\/|\-\-[^\n]*\n", string.Empty, RegexOptions.Multiline | RegexOptions.Singleline);

现在您可以'[^']*'在 commentFree 上运行 RegEx 来提取您的字段。

请注意,它'[^']*'比 更有效'.*?',因为它消除了 RegEx 引擎回溯的需要。现在它将找到起始引号,继续查找本身不是引号的所有字符,并以结束引号结束。上面使用相同的技术来抓取--直到行尾的注释\n

编辑: 或者,您可以使用该模式\/\*.*?\*\/|\-\-[^\n]*\n|'[^']*'匹配所有评论和引用块(不在评论中),然后仅使用'在迭代结果时开始的匹配项,因为这些将是引用块。

于 2012-05-11T17:43:39.253 回答