在文件中搜索具有特定格式的字符串的最快方法是什么?

时间:2015-04-10 09:50:30

标签: c# string full-text-search

我想在文件中找到下面的字符串。实施它的最佳方法是什么?

drop%table_name

star(%)表示你可以在drop和table_name之间使用无限制的单词

我不想逐字逐句阅读文件并处理它。

目前我正在使用richtextbox功能查找一个单词,它工作正常,但我不知道如何处理两个单词,其中一个单词在中间。请帮帮我。

我把部分代码放在一起工作正常,可以查找一个字符串。

rtb1.Text = utility.readFile(file.Path);

int index = 0;
string searchTxt = "table_name";
while (index < rtb1.Text.LastIndexOf(searchTxt))
{
    rtb1.Find(searchTxt, index, rtb1.TextLength, RichTextBoxFinds.None);
    rtb1.SelectionBackColor = Color.Yellow;
    index = rtb1.Text.IndexOf(searchTxt, index) + 1;
}

输入样本:

drop TABLE mys u_web
/
aLter table  web_cusss rename some other name;
alter table abc

/

drop TABLE mysq weation;
drop TABLE my web_quiciary     /
drop  TABLE web_qudetails;
alter table web_qegy_details modify v_table varchar2(200);
alter table                  web_ition add d_date date;

我的新代码:

 foreach (AMH_FileDetails file in fileList)
            {
                fileIssue += file.ToString();

                if (file.Type.Equals("SQL") || file.Type.Equals("TXT"))
                {
                    string fileBody = utility.readFile(file.Path).ToUpper();
                    foreach (string searchTxt in splittedTblName)
                    {

                        string pattern = @"DROP (.*?) " + searchTxt;
                        string input = fileBody;
                        foreach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase))
                        {
                            fileIssue += match.Value + " (drop table " + searchTxt + ") at poition" + match.Index + Environment.NewLine;
                            Console.WriteLine("{0} (drop table '{1}') at position {2}",
                                              match.Value, searchTxt, match.Index);
                        }

                        pattern = @"ALTER\s*TABLE\s*" + searchTxt + "(.*?)[;/]";
                        input = fileBody;
                        foreach (Match match in Regex.Matches(input, pattern, RegexOptions.Multiline))
                        {
                            fileIssue += match.Value + " (Alter table " + searchTxt + ") at poition" + match.Index + Environment.NewLine;
                            Console.WriteLine("{0} (alter table '{1}') at position {2}",
                                              match.Value, searchTxt, match.Index);
                        }

                    }
                    //MessageBox.Show(fileIssue);

                }
                rtb1.Text = fileIssue;
                rtb1.SelectAll();
                rtb1.Copy();
                rtb1.DeselectAll();
            }

1 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式轻松完成任务:

string s = "some text drop here some words table_name another text";
var regex = new Regex(@"drop (.*?) table_name");
var match = regex.Match(s);
string words;
if (match.Success)
    words = match.Groups[1].Value;

一些解释。模式drop (.*?) table_name匹配以drop开头的每个标记,然后匹配任何符号(由*指定)的任何数字(由?指定,具有ungreedy修饰符.)直到{ {1}}。

如果匹配成功,您可以将table_namedrop之间的字词设为table_name,因为我已通过指定match.Groups[1].Value将这些符号包含在捕获组中在模式中。

您还可以从(.*?)获取整个文本匹配模式。

有关C#中的regualr表达式的更多信息,请查看Regex Quick Reference