如何进行负面的观察?

时间:2016-02-09 13:08:04

标签: c# regex

我正在尝试执行一个正则表达式否定的背后会发现SQL中存在一个不属于注释的关键字

例如

-- some comments create
/* some more comments create
some more create
*/ 
create

只有最后一个create关键字匹配,因为所有其他关键字都在评论中

到目前为止,我有这个

(?<!--.*?)(?<!/\*.*?)\bcreate\b

消除了前两个&#34;创建&#34;词语的

我需要能够通过跨越多行来消除第三个,但是我需要通过在结束注释(*/)标记上使用异常来匹配第四个

我查看了许多正则表达式网站,例如http://www.rexegg.com/regex-lookarounds.html,但我无法确定如何执行此操作。

2 个答案:

答案 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字符串。