C# 从文件中提取一个单词,然后再提取下一个单词。C

C# 从文件中提取一个单词,然后再提取下一个单词。C,c#,frm,C#,Frm,我需要一些建议。我正在制作一个应用程序来获取VB表单中的特定SQL语句,但不知道哪一个是最好的选择 例如,我有一句话要解释: FROM sys.master_files WITH (NOLOCK) 但我需要的是 FROM sys.master_files 我需要从和下一个像sys.master_文件一样的文件中获取 第一个时刻,这正是我需要的,它是一个基本的应用程序,只是为了捕捉来自和下一件事情 现在我一直在研究和研究StackOverFlow中已经提出的一些问题,我想知道Regex.

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

例如,我有一句话要解释:

  FROM sys.master_files WITH (NOLOCK)
但我需要的是

 FROM sys.master_files
我需要从和下一个像sys.master_文件一样的文件中获取

第一个时刻,这正是我需要的,它是一个基本的应用程序,只是为了捕捉来自和下一件事情

现在我一直在研究和研究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,但无法提供连续性,因为我不理解它的操作


为了更好地理解,我来自巴西,所以我将代码的成对变量稍微改成了英语,以便于理解代码。

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

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();

我相信还有很多。这是正则表达式的防御任务:

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

我用你的标题来理解这个问题,你需要字符串的前两个单词。使用IndexOf和Substring:

string original = "FROM sys.master_files WITH (NOLOCK)";
string firstTwoWords = original.Substring(0, original.IndexOf(' ', original.IndexOf(' ')+1));
应该可以从sys.master_文件中找到您

第二行的作用是获取原始字符串的一部分,该部分从索引0开始,以第二次出现的空格结束。但是,如果单词之间有多个空格是偶然写的,那么这种方法就不能很好地工作

因此,您可以这样做来处理空空间:

    string original = "FROM sys.master_files  WITH (NOLOCK)";
    string[] array = original.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
    string newString = array[0] +' '+ array[1];

你也可以在上用你的语言问这个问题,我知道,但我喜欢英语上的Stack,我正在重新学习英语,所以这是一个很好的练习。我明白了,但我通过了在VB中阅读整个代码,比如4k行,示例只有一行。我能不能换一个…的例子。。。并传递正在读取所有文本的变量?@Rodolwulivieri是的,正则表达式将比手动文本解析更快。好的,我会试试这个,谢谢。我正在学习C,所以对我来说有点复杂,但我会尝试。这是我发布的一个示例,但我如何处理VB表单的大文件SQL不是这样的。有时可以从variable1中选择*并继续。但我喜欢这样,我也会试试。