无法识别的字符转义'-'|弹性搜索

时间:2018-11-15 10:42:35

标签: regex elasticsearch

我正在尝试创建带有以下条件的正则表达式:“或maslo直到空格,破折号或行尾,或者以mas开头,然后是从一个字符到无穷大的任何字符(空格或破折号除外) “。

{
  "regexp": {
    "name": {
      "value": "(maslo( |-|$)|mas[^ \-]+)"
    }
  }
}

根据Regexp Query Documentation最后一行“字符类”段落,该表达式[^ \-]应该是正确的,

[^abc\-] # any character except '-' or 'a' or 'b' or 'c'

但是我收到错误:

{
    "type": "json_parse_exception",
    "reason": "Unrecognized character escape '-' (code 45)\n at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@2a7b147b; line: 8, column: 47]"
}

我想念什么吗?感谢您的任何建议。

1 个答案:

答案 0 :(得分:3)

您可以将连字符放在字符类的开头,以避免不得不在ES regex中对其进行转义:

"(maslo([- ]|$)|mas[^- ]+)"
         ^           ^

否则,您将需要使用双反斜杠,因为使用单个反斜杠定义了常规的字符串转义,而文字反斜杠(即正则表达式转义)是使用两个连续的反斜杠形成的。

在ES regex文档中,示例中仅使用一个反斜杠,因为这些模式以其文字形式而不是字符串文字形式编写。