C#.NET Regex:需要有关使用排除项编写组表达式的帮助

时间:2012-05-09 15:28:34

标签: .net regex regex-group

我不是专家,但我正在尝试编写.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'

1 个答案:

答案 0 :(得分:0)

我无法找到一个优雅的RegEx来一步完成你想做的事情,但你可以分两步完成。

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

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

请注意'[^']*''.*?'更有效,因为它不需要RegEx引擎回溯。现在它将找到开始引用,继续为所有不是引用的字符,并以最终引用结束。上面使用相同的技术在--之后抓取评论,直到行\n结束。

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