gpt4 book ai didi

c# - 类似 Google 的搜索查询标记化和字符串拆分

转载 作者:太空狗 更新时间:2023-10-29 17:41:09 26 4
gpt4 key购买 nike

我希望对搜索查询进行标记化,类似于 Google 的做法。例如,如果我有以下搜索查询:

the quick "brown fox" jumps over the "lazy dog"

我想要一个包含以下标记的字符串数组:

the
quick
brown fox
jumps
over
the
lazy dog

如您所见,标记保留了双引号中的空格。

我正在寻找一些示例,说明如何在 C# 中执行此操作,最好不要使用正则表达式,但是如果这最有意义并且性能最高,那就这样吧。

我还想知道如何扩展它以处理其他特殊字符,例如,将 - 放在术语前面以强制从搜索查询中排除等等。

最佳答案

到目前为止,这看起来很适合 RegEx。如果它变得更加复杂,那么可能需要更复杂的标记化方案,但除非必要,否则您应该避免使用该路线,因为它的工作量要大得多。 (另一方面,对于复杂的模式,正则表达式很快就会变成一只狗,同样应该避免)。

这个正则表达式应该可以解决您的问题:

("[^"]+"|\w+)\s*

这是一个 C# 用法示例:

string data = "the quick \"brown fox\" jumps over the \"lazy dog\"";
string pattern = @"(""[^""]+""|\w+)\s*";

MatchCollection mc = Regex.Matches(data, pattern);
foreach(Match m in mc)
{
string group = m.Groups[0].Value;
}

此方法的真正好处是它可以很容易地扩展以包含您的“-”要求,如下所示:

string data = "the quick \"brown fox\" jumps over " +
"the \"lazy dog\" -\"lazy cat\" -energetic";
string pattern = @"(-""[^""]+""|""[^""]+""|-\w+|\w+)\s*";

MatchCollection mc = Regex.Matches(data, pattern);
foreach(Match m in mc)
{
string group = m.Groups[0].Value;
}

现在我和下一个人一样讨厌阅读正则表达式,但是如果你把它分开,这个很容易阅读:

(
-"[^"]+"
|
"[^"]+"
|
-\w+
|
\w+
)\s*

解释

  1. 如果可能,匹配一个减号,然后是一个“,然后是下一个”之前的所有内容
  2. 否则匹配 "后跟所有内容直到下一个 "
  3. 否则匹配 - 后跟任何单词字符
  4. 否则尽可能多地匹配单词字符
  5. 将结果放在一个组中
  6. 吞下所有后续空格字符

关于c# - 类似 Google 的搜索查询标记化和字符串拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1883188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com