【问题标题】:Best way to use RegEx on large text在大文本上使用 RegEx 的最佳方法
【发布时间】:2012-10-18 02:05:31
【问题描述】:

我有一个文本列,其中包含来自 PDF、word、excel 等的纯文本。使用 SQL 搜索短语效果很好。

用户希望在打开文件之前查看包含搜索短语的文本摘录。由于 SQL 不会返回短语在列中的位置,因此我决定使用正则表达式来查找并显示它。

当文本很大时 27 MB CPU 会跳到接近 100% 并且执行工作很慢。正则表达式模式检索搜索词前后的 5 个单词。

代码如下:

 HashSet<string> str = new HashSet<string>();

            foreach (string sPhrase in searchArr)
            {
                string sPattern;
                if (sPhrase.Contains("*"))
                    sPattern = sPhrase.Replace("*", @"\w*");
                else
                    sPattern = sPhrase;

                string pattern = "(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,5}" + sPattern + "(?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,5}";
                Debug.Write(string.Format("Pattern:{0}\n\r",pattern));

                Regex reg = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
                Match match = reg.Match(Text);

                while (!String.IsNullOrEmpty(match.Value))
                {
                    string s = match.Value;
                    if (s.Contains("\n\r"))
                        s = s.Replace("\n\r", " ");

                    s = s.Replace("\n", " ");
                    s = s.Replace("\r", " ");

                    //Checks for dups
                    if (!str.Contains(s))
                    {
                        str.Add(s);
                        AttachmentSearchResult r = new AttachmentSearchResult(s);

                        yield return r;
                    }

                    match = match.NextMatch();
                }
            }

我做错了什么?除了检索内存中的所有文本并进行搜索之外,还有更好的方法吗?或者 SQL 2005 可以完成我想要做的事情吗? 谢谢

【问题讨论】:

  • 你肯定想对一个 27 MB 的字符串进行字符串操作。
  • 你有没有对应用程序进行概要分析,以了解上述方法的哪个部分最昂贵?
  • NextMatch 和 Match(Text) 最贵

标签: c# sql-server regex


【解决方案1】:

我能想到的唯一方法是使用专门的搜索引擎。我之前用Lucene.NET 做过类似的事情,而且相对简单。您可能还想查看SimpleLucene,让您的生活更轻松。

但是,添加一个全新的搜索引擎将需要时间投资,这可能是不可行的。

【讨论】:

    【解决方案2】:

    我不确定您的要求是否可以解决,但您可以创建一个包含正则表达式的 SQL 表达式列 (doc)。这样您就可以将解析任务传递给 SQL Server。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多