正则表达式,用于类似Gmail的搜索

Jac*_*cob 5 .net regex

我一直在尝试找出类似Gmail的搜索的正则表达式,即:

name:Joe surname:(Foo Bar)
Run Code Online (Sandbox Code Playgroud)

...就像在本主题中一样。但有一点区别:如果文本中没有key:,它也会被拆分,因此:

foo:(hello world) bar:(-{bad things}) some text to search
Run Code Online (Sandbox Code Playgroud)

会返回:

foo:(hello world)
bar:(-{bad things})
some text to search
Run Code Online (Sandbox Code Playgroud)

oha*_*aal 4

没有办法使用单个正则表达式来获取您需要的所有内容。问题是没有可靠的方法来获取非关键字文本。

但是,如果我们首先获取并存储所有关键字文本,然后用空字符串进行正则表达式替换(使用相同的正则表达式),我们会突然获得搜索字符串本身!

  1. 使用以下正则表达式获取关键字和相关文本(请参阅 RegExr):

    ([a-zA-Z]+:(?:\([^)]+?\)|[^( ]+))
  2. 然后使用相同的正则表达式,使用空字符串对完整搜索字符串进行正则表达式替换。生成的字符串将是非关键字搜索文本。大致如下:

    Regex.Replace(searchtext, @"[a-zA-Z]+:(?:\([^)]+?\)|[^( ]+)", "");
    
  3. 在搜索文本的开头和结尾执行空格修剪

  4. 从搜索文本中删除两个(或更多空格)(可以使用正则表达式替换来完成,替换为单个空格):

    Regex.Replace(searchtext, @" {2,}", " ");
                                ^-- 注意空格:)
    
  5. ????

  6. 利润!!!

完全有可能在 #2 中的正则表达式中执行空格删除,但在处理正则表达式时,我倾向于尽可能保持其干净。

  • 获胜者,因为它包含我正在寻找的正则表达式。除了这个答案之外,我还将添加简单的正则表达式分割“([a-zA-Z]+:(?:\([^)]+?\)|[^( ]+))”完成了这项工作。谢谢@ohaal,确实有利可图! (2认同)