我一直在尝试找出类似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)
没有办法使用单个正则表达式来获取您需要的所有内容。问题是没有可靠的方法来获取非关键字文本。
但是,如果我们首先获取并存储所有关键字文本,然后用空字符串进行正则表达式替换(使用相同的正则表达式),我们会突然获得搜索字符串本身!
使用以下正则表达式获取关键字和相关文本(请参阅 RegExr):
([a-zA-Z]+:(?:\([^)]+?\)|[^( ]+))
然后使用相同的正则表达式,使用空字符串对完整搜索字符串进行正则表达式替换。生成的字符串将是非关键字搜索文本。大致如下:
Regex.Replace(searchtext, @"[a-zA-Z]+:(?:\([^)]+?\)|[^( ]+)", "");
在搜索文本的开头和结尾执行空格修剪
从搜索文本中删除两个(或更多空格)(可以使用正则表达式替换来完成,替换为单个空格):
Regex.Replace(searchtext, @" {2,}", " ");
^-- 注意空格:)
????
利润!!!
完全有可能在 #2 中的正则表达式中执行空格删除,但在处理正则表达式时,我倾向于尽可能保持其干净。