【问题标题】:String search in C# somewhat similiar to LIKE operator in say VBC# 中的字符串搜索有点类似于 VB 中的 LIKE 运算符
【发布时间】:2019-05-07 06:40:06
【问题描述】:

我知道有人问过这个问题。而且我并不是真的在寻找这样做的功能。我希望能得到一些技巧,让我做得更好。基本上,取一个长字符串,然后在其中搜索一个较小的字符串。我知道,实际上总是有一百万种方法可以让事情变得更好,这就是把我带到这里的原因。

请看一下代码 sn-p,让我知道你的想法。不,它不是很复杂,是的,它确实可以满足我的需求,但我更感兴趣的是了解痛点将在哪里使用它,因为我认为它会起作用,但不会出于这样那样的原因。我希望这是有道理的。但是为了给这个问题一个回答的方式,这是执行这项任务的一种强有力的方式吗(我有点知道答案:))

对建设性的批评非常感兴趣,而不仅仅是“那很糟糕”。我恳请您详细说明这样的想法,以便我可以充分利用回复。

public static Boolean FindTextInString(string strTextToSearch, string strTextToLookFor)
{
    //put the string to search into lower case
    string strTextToSearchLower = strTextToSearch.ToLower(); 
    //put the text to look for to lower case
    string strTextToLookForLower = strTextToLookFor.ToLower(); 

    //get the length of both of the strings
    int intTextToLookForLength = strTextToLookForLower.Length; 
    int intTextToSearch = strTextToSearchLower.Length;

    //loop through the division amount so we can check each part of the search text
    for(int i = 0; i < intTextToSearch; i++) 
    {
        //substring at multiple positions and see if it can be found
        if (strTextToSearchLower.Substring(i,intTextToLookForLength) == strTextToLookForLower) 
        {
            //return true if we found a matching string within the search in text
            return true; 
        }
    }

    //otherwise we will return false
    return false; 
}

【问题讨论】:

  • 请提供一些示例数据和预期结果。
  • 我认为代码审查网站正是你要找的
  • 查看Like operator。它不仅仅是一个简单的FindTextInString。但是,如果您只是寻找“FindTextInString”,它可以完成这项工作,但使用 string.Contains 会更好。
  • 最接近的匹配是使用正则表达式,它提供相同的功能,但有一些语法差异。
  • 或者,.Split(...).Length &gt; 1(真的不要那样做)

标签: c# string string-matching


【解决方案1】:

要以不区分大小写的方式实现您的函数,使用IndexOf 而不是两个ToLower() 调用与Contains 的组合可能更合适。这既是因为ToLower() 会生成一个新字符串,也是因为the Turkish İ Problem

类似下面的内容应该可以解决问题,如果其中一个词是 null,则返回 False,否则使用不区分大小写的 IndexOf 调用来确定搜索词是否存在于源字符串中:

public static bool SourceContainsSearch(string source, string search)
{
    return search != null &&
           source?.IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1;
}

【讨论】:

    【解决方案2】:

    您可以通过这种方式重用 VB 的 Like 运算符:

    1) 引用 Microsoft.VisualBasic.dll 库。

    2) 使用以下代码。

    using Microsoft.VisualBasic;
    using Microsoft.VisualBasic.CompilerServices;
    
    if (LikeOperator.LikeString(Source: "11", Pattern: "11*", CompareOption: CompareMethod.Text)
    {
        // Your code here...
    }
    

    【讨论】:

      【解决方案3】:

      如果您只关心在字符串中查找子字符串,只需使用String.Contains()

      例子:

      string string_to_search = "the cat jumped onto the table";
      string string_to_find = "jumped onto";
      
      return string_to_search.ToLower().Contains(string_to_find.ToLower());
      

      【讨论】:

      • 肯定会标记它,我应该指定忽略 .contains。我想我真的很想知道,这就是 .contains 的处理方式吗?
      • @Xiaoy312 不错的参考。
      • @Xiaoy312 啊,太好了!会经常看的。
      • @MikeCMR 由于 cpu 需要做更多的工作(每次执行循环操作系统时创建子字符串的副本),它确实需要更长的时间才能实现更有效的实现。但是优化本身就是一个完整的领域,并且取决于多种因素,因此无法解释发生的一切(我自己也只知道后台播放的影响性能的事情的一小部分)
      猜你喜欢
      • 1970-01-01
      • 2019-11-01
      • 2015-06-21
      • 2017-04-07
      • 2018-11-02
      • 2023-03-27
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多