Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何执行反向后视?_C#_Regex - Fatal编程技术网

C# 如何执行反向后视?

C# 如何执行反向后视?,c#,regex,C#,Regex,我正在尝试执行一个正则表达式否定查找,它将发现SQL中存在一个不属于注释的关键字 乙二醇 ——一些注释创建 /*还有更多的评论 再创造一些 */ 创造 只有最后一个create关键字应该匹配,因为所有其他关键字都在注释中 到目前为止,我有这个 (?我认为删除注释更容易,这就是: // use these regex patterns public string RemoveSQLComments(string sqlQuery) {

我正在尝试执行一个正则表达式否定查找,它将发现SQL中存在一个不属于注释的关键字

乙二醇

——一些注释创建
/*还有更多的评论
再创造一些
*/ 
创造
只有最后一个create关键字应该匹配,因为所有其他关键字都在注释中

到目前为止,我有这个


(?我认为删除注释更容易,这就是:

    // 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字符串

(?<!--.*)(?<!/\*(?s:(?!\*/).)*)\bcreate\b
每次它匹配一个字符时,它都会首先进行负向前瞻,以确保它不是您试图排除的序列中的第一个字符


s中的
s
(?s:
使该组中的所有内容在
单线
模式下匹配,这意味着
与换行符匹配。

添加信息时请发帖子。不确定
C#
是否实现了可变长度的负后向查找。@Toto:是的,.NET正则表达式支持无限宽度的后向查找。Dave,您可以只匹配和捕获注释,然后只匹配
创建
,以便对其执行任何更改。请参阅Wiktor的注释解决了我的问题。感谢所有其他人的贡献。这里有几个问题,包括:(1)
在字符类中没有特殊意义,以及(2)你可以使用
组合选项,而不是
&
;因为这两个选项都不会对你的正则表达式产生任何影响。而且,没有必要将答案与完整的名称空间混在一起;可以假设问C问题的人都知道如何使用
使用
。你的第一个正则表达式与包含这是
*
/
中的任何一个字符,如
/*(完全有效/注释)*/
。您试图做的事情需要一个消极的前瞻,正如我在回答中所演示的:
(?!\*/)*
。使用
组合选项可确保不会应用任何选项。您的正则表达式匹配,因为您不需要任何选项。
(?s:(?!\*/).)*