Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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代码中的SQL关键字_C#_Regex - Fatal编程技术网

C# 正则表达式匹配C代码中的SQL关键字

C# 正则表达式匹配C代码中的SQL关键字,c#,regex,C#,Regex,我无法使用正则表达式检测C代码中的SQL 这是我的正则表达式字符串: (?i)(?s)\b(select)\b(.*?)\b(from)\b|\b(insert)\b(.*?)\b(into)\b|\b(update)\b(.*?)\b(set)\b|\b(delete)(.*?)\b(from)\b 我希望匹配SQL关键字,如下所示: ... SELECT ... FROM ... ... INSERT ... INTO ... ... UPDATE ... SET ... ... DELE

我无法使用正则表达式检测C代码中的SQL

这是我的正则表达式字符串:

(?i)(?s)\b(select)\b(.*?)\b(from)\b|\b(insert)\b(.*?)\b(into)\b|\b(update)\b(.*?)\b(set)\b|\b(delete)(.*?)\b(from)\b
我希望匹配SQL关键字,如下所示:

... SELECT ... FROM ...
... INSERT ... INTO ...
... UPDATE ... SET ...
... DELETE ... FROM ...
我正在使用以下网站测试我的正则表达式:

它的工作原理和我期望它在网站上的工作原理一样,但是由于一些随机原因,如果我的代码运行,这个正则表达式就不起作用

由于某种原因,Regex.Matches找不到任何匹配项

SQL可以全部在一行中,也可以延伸到多行

所以,基本上,我给我的应用程序一个目录。此目录包含.cs文件

然后我读取文件中的文本,并尝试匹配上面的正则表达式字符串

以下是我目前掌握的代码:

private string _strRegex = "(?i)(?s)\b(select)\b(.*?)\b(from)\b|\b(insert)\b(.*?)\b(into)\b|\b(update)\b(.*?)\b(set)\b|\b(delete)(.*?)\b(from)\b";

string lines = string.Empty;
bool foundMatch = false;
//Match the text to our regular expression, and see if we find a match anywhere.
foreach (Match match in Regex.Matches(strFile, _strRegex))
{
    //Get the line number this match occurred at in the file.
    var lineNumber = strFile.Take(match.Index).Count(c => c == '\n') + 1;
    //Get the actual line.
    int lineNum = 0;
    using (StringReader reader = new StringReader(strFile))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            lineNum++; //First, increment!

            if (lineNum == lineNumber)
            {
                line = line.Trim();
                if (!line.StartsWith("//"))
                {
                    foundMatch = true;
                    lines += $@"    [Line {lineNumber}] - {line}{Environment.NewLine}";
                    break;
                }
            }
        }
    }
}

if (foundMatch)
{
    File.AppendAllText(_itemsLogPath, $@"{file}{Environment.NewLine}{lines}{Environment.NewLine}");
}
SQL可以全部在一行中,也可以延伸到多行中。-我想问题可能就在这一点上

尝试使用RegexOptions来指定此选项。 它看起来是这样的:

var regex = new Regex(@"...pattern", RegexOptions.IgnoreCase);
编辑1

正如所提到的。。不要忘记模式字符串前面的@,将其声明为文字字符串。

SQL可以全部位于一行中,也可以延伸到多行中。-我想问题可能就在这一点上

尝试使用RegexOptions来指定此选项。 它看起来是这样的:

var regex = new Regex(@"...pattern", RegexOptions.IgnoreCase);
编辑1


正如所提到的。。不要忘记模式字符串前面的@,将其声明为文字字符串。

问题是\b正试图转换为c字符串快捷方式,而不是正则表达式代码,您需要将字符串文字化

private string _strRegex = @"(?i)(?s)\b(select)\b(.*?)\b(from)\b|\b(insert)\b(.*?)\b(into)\b|\b(update)\b(.*?)\b(set)\b|\b(delete)(.*?)\b(from)\b";

这个可怜的小@造成了所有的不同

问题是\b正试图转换为c字符串快捷方式,而不是正则表达式代码,您需要将字符串文字化

private string _strRegex = @"(?i)(?s)\b(select)\b(.*?)\b(from)\b|\b(insert)\b(.*?)\b(into)\b|\b(update)\b(.*?)\b(set)\b|\b(delete)(.*?)\b(from)\b";

这个可怜的小@让一切都不同了

我假设您的CS文件不包含任何LINQ表达式,或者您将得到一大堆误报。在C代码中检测SQL-为什么?无论如何,请阅读并提供一个系统发生-是的,我的代码中有LINQ,但它不是那么多。而且,它们不会匹配,因为LINQ表达式的顺序与SQL键的顺序不同,例如:from。。。选择LINQ,etc@FrederikMoller除非有两个LINQ表达式,并且第一个表达式中的select from与第二个表达式中的from匹配。如果将_stregex=@…,会发生什么情况。。。。例如文字字符串?我假设您的CS文件不包含任何LINQ表达式,或者您将得到一大堆误报。在C代码中检测SQL-为什么?无论如何,请阅读并提供一个系统发生-是的,我的代码中有LINQ,但它不是那么多。而且,它们不会匹配,因为LINQ表达式的顺序与SQL键的顺序不同,例如:from。。。选择LINQ,etc@FrederikMoller除非有两个LINQ表达式,并且第一个表达式中的select from与第二个表达式中的from匹配。如果将_stregex=@…,会发生什么情况。。。。例如文字字符串?它仍然无法使用以下内容找到任何匹配项:。但是,您确实给了我将ignore case指定为regex options的选项,我把它放在regex字符串中:RegexOptions.Multiline是在这种情况下使用的错误标志。它停了。从匹配一个换行符开始。@Phylogenesis哦,是的,你是对的,我的错。反过来说。我根据更新了答案,但仍然没有找到任何匹配项,请使用:。但是,您确实给了我将ignore case指定为regex options的选项,我把它放在regex字符串中:RegexOptions.Multiline是在这种情况下使用的错误标志。它停了。从匹配一个换行符开始。@Phylogenesis哦,是的,你是对的,我的错。反过来说。我几乎花了一整天的时间更新了答案,试图找出为什么它不起作用,现在你来告诉我补充一点。桑克斯:!我过去对它着迷:pAlmost花了一整天的时间试图弄清楚它为什么不起作用,现在你来告诉我补充一句。桑克斯:!我过去对它着迷:p