我正在寻找类似于谷歌的做法来标记搜索查询。例如,如果我有以下搜索查询:
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*
解释
- 如果可能,匹配一个减号,后跟一个“,然后是所有内容,直到下一个”
- 否则匹配一个“,后跟所有内容,直到下一个”
- 否则匹配 - 后跟任何单词字符
- 否则匹配尽可能多的单词字符
- 将结果放入一组
- 吞掉任何后续空格字符
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)