替换零和修剪空间正则表达式模式似乎在弹性搜索分析器中没有按预期工作

时间:2015-12-15 16:26:45

标签: regex elasticsearch

基本上我希望我的索引/搜索分析器删除某些字符。 我不想要领先0或任何领先或尾随空格。下面是我定义的字符过滤器。请注意我尝试的模式。我不是正则表达式专家,但我期待这个工作。

    "char_filter" : {
        "replace_zeros_pattern" : {
            "type" : "pattern_replace",
            "pattern" : "^0*|\s",
            "replacement" : ""
        }
    },

但弹性有以下例外:

  

{"错误":" ElasticsearchParseException [无法解析create> index的来源];嵌套:JsonParseException [无法识别的字符转义' s' (代码> 115)\ n在[来源:[B @ 461feff0; line:1,column:318]]; ""状态" 400}

1 个答案:

答案 0 :(得分:1)

你需要双击你的“s”。字符串文字"\\s"将导致“\ s”存储在字符串中,这就是你想要的。

那应该解决错误。在那之后,我认为你想要的模式实际上是"^\\s*0*|\\s*$"该模式(当全局应用时)将删除零或更多空格,后跟在字符串开头的零或更多“零”,以及任何空格出现在字符串的末尾。

您的模式不起作用,因为^0*|\s表示“在字符串的开头查找0*,如果这不起作用,那么在字符串中的任何位置查找\s ”。问题是,0*确实成功 - 它只匹配零个字符(因为*表示零或更多)。所以它不会继续尝试寻找任何空间。 |是独家或在这种情况下。现在你可以尝试^(0|\\s)*。这将查看字符串的开头为零或空格,并一遍又一遍地继续这样做,直到它找不到为止。但是,这也会匹配'0 0 0 1234'之类的东西,这可能不是你想要的。

请注意,在我的模式中,我也使用|,这意味着它将匹配^\s*0*\s*$。这就是为什么它需要全局应用以确保修剪前导零和空格以及尾随空格的原因。