C# 解析Lucene查询语法并转义CloudSearch

C# 解析Lucene查询语法并转义CloudSearch,c#,regex,lucene,lucene.net,amazon-cloudsearch,C#,Regex,Lucene,Lucene.net,Amazon Cloudsearch,基本上,我有一个需要同时支持Lucene.NET和Amazon CloudSearch的应用程序 因此,我无法重新编写查询,我需要使用lucene的标准查询,并在查询上使用.ToString()来获取语法 问题是,在Lucene.NET中(我不知道这在java版本中是否相同),.ToString()方法返回原始字符串,但不包含转义字符 因此, (title:blah:blah summary:"lala:la") 应该是 (title:blah\:blah summary:"lala\:la"

基本上,我有一个需要同时支持Lucene.NET和Amazon CloudSearch的应用程序

因此,我无法重新编写查询,我需要使用lucene的标准查询,并在查询上使用.ToString()来获取语法

问题是,在Lucene.NET中(我不知道这在java版本中是否相同),.ToString()方法返回原始字符串,但不包含转义字符

因此,

(title:blah:blah summary:"lala:la")
应该是

(title:blah\:blah summary:"lala\:la")
我需要的是一个可以添加转义的正则表达式

这可能吗?如果是这样,它会是什么样子

其他一些可能的差异:

(title:"this is a search:term")
(field5:"this is a title:term")

可以使用此正则表达式在字符串的关键点转义冒号

(?<!title|summary):
输出

(title:blah:blah summary:"lala:la")
(title:blah\:blah summary:"lala\:la")

根据注释和编辑,您似乎希望任何查询字符串都能被正则表达式正确转义,并且任何给定的lucene查询都能由结果字符串准确表示

那不会发生的

Lucene查询语法不能表达所有Lucene查询。事实上,从
Query.toString()
中获得的字符串通常甚至不能被
QueryParser
解析,而不管它是对查询的精确重建

长话短说:你走错了方向
Query.ToString()
不是为序列化查询而设计的,它的目标不是创建可解析字符串查询。主要是调试之类的。如果您一直试图以这种方式使用它,那么试图使用正则表达式来逃避不明确的查询语法的愚蠢行为很可能只是麻烦的开始


.

您可能会执行
Regex.Replace(查询,([-+!(){}[\]^“~*?:])|(?:\\\\\\\\\\\)|(?:&&-),“\\$1”)
确切的要求是什么?在哪里以及应该转义什么?只要
?当它是非空白序列中的第二个冒号时?试试看。你更多的是编码,而不是解析..NET有几个编码器。不是你需要的那个,但是谢谢你的回答,但是,我应该已经很清楚,标题和摘要只是h的2无数个字段,其中一些我在编译时不知道的名称。另外,如果文本包含
标题:“something title:go”
,则不会被正确捕获,是吗?我根据您的问题回答。根据字符串的复杂程度,您可以随时修改模式。对于您的问题,此模式将起作用
(?请看演示,如果有一个针对所有(至少更多)语法的查询解析器,那就太酷了……太糟糕了……看起来,对于“简单”查询,我可以通过复制.ToString()方法的逻辑走得很远(必须热爱开源)。