在字符串中搜索带引号的短语和其他关键字的匹配项

本文关键字:其他 关键字 短语 搜索 字符串 | 更新日期: 2023-09-27 18:32:18

作为我试图完成的一个例子,这里有一些代码,它构建了一个带有名为Sentence的字符串属性的书籍列表。

public class Book {
    public string Sentence { get; set; }
}
Book book1 = new Book() { Sentence = "The quick brown fox jumps over the lazy dog" };
Book book2 = new Book() { Sentence = "The quick brown frog jumps over the lazy sloth" };
List<Book> books = new List<Book>();
books.Add(book1);
books.Add(book2);

我想根据一些用户输入搜索书籍列表(搜索要求不应该比此示例更复杂)。

如果用户提供的搜索短语是 quick fox "lazy dog" ,那么我返回了一个列表,其中 book1 是集合的成员。 如果用户提供的搜索短语为 quick fox sloth则不应返回任何内容,因为这三个单词不会全部出现在任何属性中。

总结

  1. quick fox "lazy dog" - 1 结果(引号中的单词一起出现,其余单词单独出现)

  2. quick fox sloth - 无结果

  3. "lazy sloth" - 1 结果(两个单词一起出现在字符串中)

  4. lazy sloth - 1 结果(两个单词都出现在字符串中)

我目前拥有的代码:

//Turn the search word into an array of words (includes support for quotes phrases).  E.g: quick fox "lazy dog" becomes a list of these values: `quick`, `fox`, `lazy dog`.
var searchWords = Regex.Matches(searchWord, @"(?<match>'w+)|'""(?<match>['w's]*)""")
                       .Cast<Match>()
                       .Select(m => m.Groups["match"].Value)
                       .ToList();
var query = from b in books
            where (!string.IsNullOrEmpty(b.Sentence) && searchWords.Any(b.Sentence.Contains))
            select b;

这不适用于情况 2。 我现在拥有的代码只是寻找 1 个匹配项,如果它获得 1 个匹配项,则它认为找到的项目。

在字符串中搜索带引号的短语和其他关键字的匹配项

我想

你可能想要All() LINQ 方法,试试这个:

var query = from b in books
            where (!string.IsNullOrEmpty(b.Sentence) && searchWords.All(word => b.Sentence.Contains(word)))
            select b;

与其重新发明轮子,我会使用 Lucene.Net。您甚至不需要磁盘上的索引。所有索引+搜索都可以在内存中完成(使用Lucene的RamDirectory)