我正在寻找类似于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; }
现在我讨厌阅读Regex和下一个人一样,但是如果你把它分开,这个很容易阅读:
( -"[^"]+" | "[^"]+" | -\w+ | \w+ )\s*
说明
>如果可能匹配一个减号,其次是“随后的一切,直到下一个”>否则匹配一个“后面的一切,直到下一个”>否则匹配a – 后跟任何单词字符>否则可以匹配尽可能多的单词字符>将结果放在一个组中>吞下任何以下的空格字符