如何检查我的List 中的任何单词是否包含在文本中

我有一个

List words = new List {"word1", "word2", "word3"}; 

如果我的字符串包含任何这些单词,我想检查使用linq; Smthng喜欢:

 var q = myText.ContainsAny(words); 

第二,如果我也有一个句子列表:

 List sentences = new List { "sentence1 word1" , "sentence2 word2" , "sentence3 word3"}; 

并且还要检查这些句子中是否包含任何这些单词!

  var q = sentences.Where(s=>words.Any(s.text)).... 

如果只需要检查子字符串,则可以使用简单的LINQ查询:

 var q = words.Any(w => myText.Contains(w)); // returns true if myText == "This password1 is weak"; 

如果要检查整个单词,可以使用正则表达式:

  1. 匹配正则表达式,这是所有单词的分离:

     // you may need to call ToArray if you're not on .NET 4 var escapedWords = words.Select(w => @"\b" + Regex.Escape(w) + @"\b"); // the following line builds a regex similar to: (word1)|(word2)|(word3) var pattern = new Regex("(" + string.Join(")|(", escapedWords) + ")"); var q = pattern.IsMatch(myText); 
  2. 将字符串拆分为带有正则表达式的单词,并测试单词集合的成员资格(如果将make单词用于HashSet而不是List则会更快):

     var pattern = new Regex(@"\W"); var q = pattern.Split(myText).Any(w => words.Contains(w)); 

为了根据这个标准过滤句子集合,你所要做的就是把它放到一个函数中并调用Where

  // Given: // bool HasThoseWords(string sentence) { blah } var q = sentences.Where(HasThoseWords); 

或者把它放在lambda中:

  var q = sentences.Where(s => Regex.Split(myText, @"\W").Any(w => words.Contains(w))); 
 var q = words.Any(w => myText.Contains(w)); 

要返回包含一个或多个单词的所有句子:

 var t = sentences.Where(s => words.Any(w => s.Contains(w))); foreach (var sentence in t) { Console.WriteLine(sentence); } 

虽然所提供的大多数解决方案都是可用的(所有调用Contains ,它将为您提供所需的解决方案),但如果列表和文本很大,则可能存在性能问题。

从陈述的问题来看,我认为你在空格或任何其他除数之间称呼任何单词。 所以,我建议你将myText分成一个单词列表,并将它们中的每一个与你的单词列表进行比较,现在使用contains。

当然,它更复杂; 您必须确保正确分割单词 – 但是使用较大的字符串(例如,文本文件)可能会有一些性能提升。

为你的第一个条件

 List words = new List { "word1", "word2", "word3" }; string test = "word1"; bool isFound = words.Contains(test); 

为你的第二个条件

 bool isFound = sentences.Any(x => x.Split(new char[] { ' ' }).Contains(test)); 

作为一个无关的旁注

在获得一些答案后,您正在更改问题的范围,这不是提问的好方法。 🙂