1

我在这里需要一些建议。我正在制作一个应用程序以在 VB 表单中获取特定的 SQL 语句,但不知道哪个是最好的选择。

例如我有这句话来解释:

  FROM sys.master_files WITH (NOLOCK)

但我需要的是

 FROM sys.master_files

我需要得到FROM下一个像sys.master_files

这正是我所需要的,它是一个基本的应用程序,只是为了捕捉 FROM 和接下来的事情。

现在我一直在研究和查看一些已经在 StackOverFlow 中提出的问题,我想知道这是否Regex.Match是一种更快的方法来进行此检查,或者我是否可以使用IndexOf但我不太了解它是如何工作的。

这就是我迄今为止在代码中所做的。

private void btnSearch_Click(object sender, EventArgs e)
{
    string value = cboParam.Text;
    string[] reservedWords = { "FROM", "SELECT", "JOIN", "UPDATE", "DROP", "ALTER", "CREATE" };

    if (cboParam.Text == "")
    {
        MessageBox.Show("Wrong try again.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    else
    {
        List<string> listParam = new List<string>();
        listParam.Add(value);
        if (selectedPath == null && openFileDialog.FileNames == null)
        {
            MessageBox.Show("Choose a directory please.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else if (selectedPath != null)
        {
            foreach (string str in selectedPath)
            {
                string split = " ";
                string readText = File.ReadAllText(str)
                    .Replace("\n", split)
                    .Replace("\r", split)
                    .Replace("_", split)
                    .Replace("-", split)
                    .Replace("SQL", split)
                    .Replace("sql", split)
                    .Replace("FROM", split)
                    .Replace("from", split)
                    .Replace("JOIN", split)
                    .Replace("join", split)
                    .Replace("UPDATE", split)
                    .Replace("update", split)
                    .Replace("DELETE", split)
                    .Replace("delete", split);
                readText.IndexOf(value);

            }
        }
        else if (openFileDialog.FileNames != null)
        {
            foreach (string str in openFileDialog.FileNames)
            {
                string split = "\nGO";
                string readText = File.ReadAllText(str) 
                    .Replace("\n", split)
                    .Replace("\r", split)
                    .Replace("_", split)
                    .Replace("-", split)
                    .Replace("SQL", split)
                    .Replace("sql", split)
                    .Replace("FROM", split)
                    .Replace("from", split)
                    .Replace("JOIN", split)
                    .Replace("join", split)
                    .Replace("UPDATE", split)
                    .Replace("update", split)
                    .Replace("DELETE", split)
                    .Replace("delete", split);

                readText.IndexOf(value);
            }
        }
    }
}

这就是我所拥有的,我试图使用 IndexOf 但无法给出连续性,因为我不了解它的操作。

为了更好地理解我来自巴西,所以我将代码的对变量更改为英文,以变得“易于”理解代码。

4

3 回答 3

1

对于正则表达式来说,这无疑是一项任务:

var input = "FROM sys.master_files WITH (NOLOCK) FROM sys1.master_files1 WITH (NOLOCK)";
var rg = new Regex(@"FROM [a-zA-Z0-9\._]+ ");
var result = rg.Matches(input);
于 2014-12-19T13:35:12.387 回答
0

如果您正在寻找一个正则表达式来获得该部分:

string s = System.Text.RegularExpressions.Regex.Match("test FROM sys.master_files WITH (NOLOCK)", "FROM ([^ ]*)").Groups[1].Value;

使用 Linq 的另一种解决方案:

string xx = "test FROM sys.master_files WITH (NOLOCK)";
string yy = xx.Split(' ').SkipWhile(x => x != "FROM").Take(2).Last();

我敢肯定还有更多。

于 2014-12-19T13:34:16.597 回答
0

我是根据您的标题对问题的理解,该标题表示您需要字符串的前两个单词。使用 IndexOf 和子字符串:

string original = "FROM sys.master_files WITH (NOLOCK)";
string firstTwoWords = original.Substring(0, original.IndexOf(' ', original.IndexOf(' ')+1));

应该让你从 sys.master_files

第二行的作用是获取原始字符串的一部分,该字符串从索引 0 开始,以第二次出现的空格结束。但这不适用于单词之间的多个空格(偶然写入)。

所以你可以做这样的事情来处理空白:

    string original = "FROM sys.master_files  WITH (NOLOCK)";
    string[] array = original.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
    string newString = array[0] +' '+ array[1];
于 2014-12-19T13:49:54.640 回答