【问题标题】:How to Find List Item that is Present in a String如何查找字符串中存在的列表项
【发布时间】:2021-10-26 06:04:32
【问题描述】:

我必须找出字符串是否包含列表中存在的确切单词之一。 例如:

List<string> KeyWords = new List<string>(){"Test","Re Test","ACK"};
String s1 = "Please give the Test"
String s2 = "Please give Re Test"
String s3 = "Acknowledge my work"

现在, 当我使用:Keywords.Where(x=>x.Contains(s1)) 它给了我一个正确的匹配。但对于 s3,它不应该。

任何解决方法。

【问题讨论】:

  • List L1=[Test, Re Test, XYZ, Value, ACK]
  • "现在在上面的 3 个字符串中,S1 和 S2 应该为真,S3 应该为假" - string 的值不是 bool 的值。
  • 我知道这只是一个理解场景的例子。
  • “请重新测试”的结果是什么? “重新测试”还是“重新测试”和“测试”?
  • KeyWords.Where(x=&gt;strToCompare.Contains(x)) 应该能帮到你

标签: c# asp.net-mvc string linq contains


【解决方案1】:

在空格的基础上使用拆分功能,匹配单词。 我希望这会奏效。

【讨论】:

  • 我有相同的想法,但列表中的字符串要包含空格。例如:重新测试。因此,当我根据空格将其拆分时,Re 和 Test 将被视为 2 个不同的单词。
  • 那有关系吗?像 Re 和 Test 将被视为单独的单词,但检查 String s2 = "Please give Re Test" 它也有分隔,然后根据您的逻辑,一个单词匹配它将返回 true,然后测试与列表第一个单词匹配。通常我们使用列表中的单个单词进行匹配。
  • Re Test 也是Test 的子集 - Re Test 不会匹配 Test 首先不匹配的任何内容,因此可以忽略。
【解决方案2】:

使用正则表达式怎么样?

public static class Program
{
    public static void Main(string[] args)
    {
        var keywords = new List<string>() { "Test", "Re Test", "ACK" };
        var targets = new[] {
            "Please give the Test",
            "Please give Re Test",
            "Acknowledge my work"
        };

        foreach (var target in targets)
        {
            Console.WriteLine($"{target}: {AnyMatches(target, keywords)}");
        }

        Console.ReadKey();
    }

    private static bool AnyMatches(string target, IEnumerable<string> keywords)
    {
        foreach (var keyword in keywords)
        {
            var regex = new Regex($"\\b{Regex.Escape(keyword)}\\b", RegexOptions.IgnoreCase);

            if (regex.IsMatch(target))
                return true;
        }

        return false;
    }
}

始终即时创建正则表达式可能不是生产中的最佳选择,因此您应该考虑根据您的关键字创建一个正则表达式列表,而不是仅将关键字存储在一个愚蠢的字符串列表中。

【讨论】:

  • 您可以使用 Regex.Escape 转义关键字,以防它们使用某些字符!
  • @YegorAndrosov 好点:更改了代码。
【解决方案3】:

你对Contains的使用是倒退的:

var foundKW = KeyWords.Where(kw => s1.Contains(kw)).ToList();

【讨论】:

  • 这比任何建议的 RegEx 解决方案都要好得多。而且速度也更快!
  • 这个通过场景3怎么样?
  • @vsarunov 很好!我更新了答案。
  • 此更新仍未解决案例 3。您有一个完整的单词要匹配。您的答案将返回 Acknowledge 匹配 ACK
  • 如果提供的字符串是“确认我的工作”?这与大小写无关,您的解决方案应该不管它。提供有效的东西并不意味着它是正确的。
【解决方案4】:

有点不同的解决方案。

void Main()
{
    var KeyWords = new List<string>(){ "Test","Re Test","ACK" };
    
    var array = new string[] {
        "Please give the Test",
        "Please give Re Test",
        "Acknowledge my work"
    };
            
    foreach(var c in array)
    {
        Contains(c,KeyWords); // Your result.
    }
}

private bool Contains(string sentence, List<string> keywords) {
        var result = keywords.Select(keyWord=>{
            var parts3 = Regex.Split(sentence, keyWord, RegexOptions.IgnoreCase).Where(x=>!string.IsNullOrWhiteSpace(x)).First().Split((char[])null); // Split by the keywords and get the rest of the words splitted by empty space
            var splitted = sentence.Split((char[])null); // split the original string.
            
            return parts3.Where(t=>!string.IsNullOrWhiteSpace(t)).All(x=>splitted.Any(t=>t.Trim().Equals(x.Trim(),StringComparison.InvariantCultureIgnoreCase)));
        }); // Check if all remaining words from parts3 are inside the existing splitted string, thus verifying if full words.
        return result.All(x=>x);// if everything matches then it was a match on full word.
}

想法是按您要查找的单词拆分,例如按ACK拆分,然后查看其余单词是否与原始字符串中拆分的单词匹配,如果剩余匹配则意味着存在单词匹配并且因此是真的。如果是部分拆分,表示取出子字符串,则单词将不匹配,因此结果将是错误的。

【讨论】:

    【解决方案5】:

    正则表达式的使用怎么样

    使用\bthe\b\b代表单词边界分隔符。

    List<string> KeyWords = new List<string>(){"Test","Re Test","ACK"};
    String s1 = "Please give the Test"
    String s2 = "Please give Re Test"
    String s3 = "Acknowledge my work"
    bool result = false ;
    foreach(string str in KeyWords)
        {
          result = Regex.IsMatch(s1 , @"\b"+str +"\b"); 
          if(result)
             break; 
        }
    
     
    

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 2015-10-05
      • 2021-01-18
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多