【问题标题】:How to get search result from the original string after searching with C#使用C#搜索后如何从原始字符串中获取搜索结果
【发布时间】:2015-01-03 17:39:40
【问题描述】:

我在这里尝试的是我可以显示包含 Textbox1.Text 中字符串的文件路径,但我无法获取并显示该文件中的字符串。

private void Search_Click(object sender, EventArgs e)
{
    string[] filePaths = Directory.GetFiles(@"C:\Users\abcdq\Downloads\Documents\", "*.pdf", SearchOption.AllDirectories);
    for (int i = 0; i < filePaths.Length; i++)
    {
        string settext = GetTextFromPDF(filePaths[i]);
        if (settext.ToUpper().Contains(textBox1.Text.ToUpper()))
        {
            MessageBox.Show(filePaths[i]);
        }
    }
}

例如:account.pdf中,有:

新用户?对于新用户,您需要填写表格到 页面右侧包含以下信息:支持参考 - 这是您与我们的支持合同编号,例如DM1234 或 RH1234。 公司名称 - 这需要是我们知道您匹配的确切名称 您的支持参考。显示名称 - 你的名字,这将 当您使用网站中的某些表格时会自动填写。 电子邮件和电子邮件确认 - 您的电子邮件地址,这将成为您的 用户名。密码 – 至少包含 6 个字符的密码 (字母、数字和符号)。

  1. 当我搜索email confirm 时,结果必须以Email confirm 的形式返回给我,而不是email confirm
  2. 不仅如此,我还在寻找返回字符串的方法,该字符串的左右两侧有更多的字符,例如Email &amp; Email confirm – Your email address

【问题讨论】:

    标签: c# asp.net search-engine


    【解决方案1】:

    如果您想知道在字符串中何处找到了您要查找的文本,请使用string.IndexOf()。例如:

    string searchText = textBox1.Text;
    int index = settext.IndexOf(searchText, StringComparison.OrdinalIgnoreCase);
    
    if (index >= 0)
    {
        string foundText = settext.Substring(index, searchText.Length);
    }
    

    对于更复杂的搜索,您可以使用System.Text.RegularExpressions.Regex 类。它返回 Match 对象,这些对象又包含描述实际匹配文本的 Group 对象。

    编辑:

    要适应返回找到的文本周围的上下文,请使用以下替代方法:

    string searchText = textBox1.Text;
    int prefix = 5, postfix = 5;
    int index = settext.IndexOf(searchText, StringComparison.OrdinalIgnoreCase);
    
    if (index >= 0)
    {
        string foundText = settext.Substring(index, searchText.Length);
        int contextStart = Math.Max(0, index - prefix);
        int contextLength = Math.Min(
            settext.Length - contextStart, searchText.Length + prefix + postfix);
        string contextText = settext.Substring(contextStart, contextLength);
    }
    

    当然你可以随意初始化prefixpostfix;为了示例,我在这里对它们进行了硬编码。

    【讨论】:

    • 由于字符串量大,我还在寻找最快的搜索方式。根据我在 Internet 上的调查, Contains() 的运行速度比 IndexOf() 快。
    • 嗯,a) 我怀疑你的“互联网调查”实际上告诉你任何关于 your 代码在实际中的 actual 性能 -世界,并且 b) 如果您需要知道实际匹配的文本,Contains() 是否比IndexOf() 快并不重要,因为Contains() 方法不会告诉您这一点。您是否希望拥有快速但不能满足您要求的代码?或者代码速度较慢但确实可以满足您的需求? (并不是说您实际上必须选择,但如果您选择了...)
    • 太好了。如何在我的线程中解决案例 2?在第一种情况下,您的代码运行良好。但是,它现在只解决了我的一半问题。
    • 对不起...您问题的第二部分在语法上不正确,所以我没有(仍然不)理解它。除了简单地从index 中减去一些数字并将一些数字添加到子字符串的总长度之外,您还想要做什么?也就是说,无论如何在同一个帖子中发布两个问题都不是一个好主意,因为它会使回答过程复杂化,并且存在回答没有注意到问题的风险。恕我直言,您应该将第二部分作为一个新问题发布,使用您到目前为止所获得的内容作为起点。
    • 很抱歉给您带来不便,我的英语可能不太好。所以我想要的是:5 个字符 + 电子邮件确认 + 5 个字符为Email &amp; Email confirm – Your
    猜你喜欢
    • 2020-03-19
    • 2012-04-10
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2013-01-30
    • 2019-06-30
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多