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

时间:2017-01-11 13:06:22

标签: c# regex

我无法使用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 ...
... DELETE ... FROM ...

我使用以下网站测试我的正则表达式:

http://regexstorm.net/tester

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

" Regex.Matches"由于某种原因没有找到任何匹配。

SQL可以只在一行中,或者SQL可以在多行上延伸。

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

然后我读取文件中的文本,并尝试匹配上面的Regex字符串。

这是我到目前为止的代码:

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}");
}

2 个答案:

答案 0 :(得分:2)

SQL可以在一行中,或者SQL可以在多行上延伸。 - 我认为问题可能就在这一点上。

尝试使用RegexOptions来指定此内容。 它看起来像这样:

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

修改1

BugFinder所述,..不要忘记模式字符串前面的@,将其声明为文字字符串。

答案 1 :(得分:2)

问题是\ 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";

那个可怜的小@会有所不同