Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex获取ES查询中的所有字段名称_Regex_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Regex,elasticsearch" /> elasticsearch,Regex,elasticsearch" />

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我在我的答案中添加了第三个版本。