Regex获取ES查询中的所有字段名称
我正在尝试获取弹性搜索查询的所有字段名称 例如:Regex获取ES查询中的所有字段名称,regex,
elasticsearch,Regex,
elasticsearch,我正在尝试获取弹性搜索查询的所有字段名称 例如:name:“汤姆”和city:(“旧金山”或“墨西哥”)以及id:(“123:34 X2”)应该给我name,city和id 我已经试用了([^:\s]+):regex,它将为我提供所有匹配项,对于每个匹配项,第一组将为我提供字段名称 但这个正则表达式在某些情况下失败了,其中字段_值包含列。由于弹性搜索接受字段值中的列(或任何弹性搜索保留字),当它们被引号包围或用反斜杠(“\”)转义时,我们如何编写考虑所有情况的正则表达式 下面是我观察到的几个re
name:“汤姆”和city:(“旧金山”或“墨西哥”)以及id:(“123:34 X2”)
应该给我name
,city
和id
我已经试用了([^:\s]+):
regex,它将为我提供所有匹配项,对于每个匹配项,第一组将为我提供字段名称
但这个正则表达式在某些情况下失败了,其中字段_值包含列。由于弹性搜索接受字段值中的列(或任何弹性搜索保留字),当它们被引号包围或用反斜杠(“\
”)转义时,我们如何编写考虑所有情况的正则表达式
下面是我观察到的几个regex([^:\s]+):
名称:“汤姆”和城市:(“旧金山”或“墨西哥”)和id:(“123:34 X2”)
应该只给出名称、城市和id。但使用正则表达式,我可以得到名称、城市、id((“123”)name:“Tom”和city:(“SanFransico”或“Mexico”)和id:123 \:34
是有效的ES查询,应该只给出名称、城市和id。但是使用我的正则表达式,我得到的是name、city、id,123第三版: 只需稍加调整即可处理条件周围的大括号
(\w+)\s*:\s*((“[^”]+”)|(\([^)]+\)|[^\s]+)
我刚刚将第二个版本的第一部分([^\s:]+)
更改为(\w+)
模式[^\s::]+
匹配不是空格或冒号(包括大括号)的每个字符
模式\w+
仅匹配单词字符,这在大多数情况下都应该适用,除非您的字段名包含除[a-zA-Z0-9.]
以外的字符。但希望情况永远不会如此;-)
第二版: 一个稍微好一点的版本可能如下,但我担心创建一个ES查询总是可能导致误报的,因为查询可能是任意复杂的。你能做的最好的事情就是调整你的正则表达式,直到它符合你的需要
([^\s:]+)\s*:\s*(“[^”]+”)|(\([^)]+\)|[^\s]+)
说明:
([^\s:]+)
=字段名
\s*:\s*
=用可选空格包围的冒号
“[^”]+”
=字段值被“
\([^]+\)
=由()
[^\s]+
=文本字段值
第一版: 我刚刚在您的正则表达式前面添加了一个
(^\s)
:(^\s)([^:\s]+):
这意味着字段名位于字符串(^
)的开头,或者(|
)直接位于空白(\s
)之后。然后字段名位于捕获组2中
您是否可以为有问题的案例提供一个例子?我已经为有问题的案例添加了一些例子。谢谢,但如果“Sai”和“city:(“VIZAG”或“DELHI”)以及id:(“123:34 X2”)字段中的值在“和第一个字母之间有空格,则此操作将失败。在上面的示例中,123:也被捕获。但此查询是有效的es查询。谢谢你,我需要帮助。您能帮我修改上面的正则表达式吗?这样即使在查询周围有大括号,它也可以工作。示例:(名称:“Sai”和城市:(“维扎格”或“德里”)以及id:(“123:34 X2”)(名称:“Sai”)和(城市:(“维扎格”或“德里”)以及id:(“123:34 X2”)@TomCruise我在我的答案中添加了第三个版本。