我正在尝试执行一个正则表达式否定的背后会发现SQL中存在一个不属于注释的关键字
例如
-- some comments create
/* some more comments create
some more create
*/
create
只有最后一个create关键字匹配,因为所有其他关键字都在评论中
到目前为止,我有这个
(?<!--.*?)(?<!/\*.*?)\bcreate\b
消除了前两个&#34;创建&#34;词语的
我需要能够通过跨越多行来消除第三个,但是我需要通过在结束注释(*/
)标记上使用异常来匹配第四个
我查看了许多正则表达式网站,例如http://www.rexegg.com/regex-lookarounds.html,但我无法确定如何执行此操作。
答案 0 :(得分:0)
(?<!--.*)(?<!/\*(?s:(?!\*/).)*)\bcreate\b
第二个lookbehind的目标是确保它在找到*/
之前不会跨越/*
的任何实例。我正在使用的技术叫做 tempered lookahead :
(?s:(?!\*/).)*
每次匹配一个角色时,它首先会做一个负向前瞻,以确保它不是你试图排除的序列的第一个字符。
s
中的(?s:
会导致该群组中的所有内容都以Singleline
模式匹配,这意味着.
会匹配换行符。
答案 1 :(得分:-1)
我认为删除评论更容易,这就是:
// use these regex patterns
public string RemoveSQLComments(string sqlQuery)
{
Regex r1 = new Regex(@"(\/\*)(?s:(?!\*\/).)*(\*\/)", System.Text.RegularExpressions.RegexOptions.Multiline &
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
Regex r2 = new Regex("(--)[^\r\n$]*(?=(\r|\n|$))", System.Text.RegularExpressions.RegexOptions.Multiline &
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
return r2.Replace(r1.Replace(sqlQuery, ""), "");
}
结果将是没有任何注释的SQL字符串。