Elasticsearch——》正则regexp

  • 一、概念
  • 二、语法
  • 三、标准操作符
  • 1、匹配任意字符
  • 2、匹配一个或多个字符
  • 3、匹配零个或多个字符
  • 4、匹配零个或一个字符
  • 5、最小最大匹配次数
  • 6、分组
  • 7、匹配左侧或右侧
  • 8、匹配字符的范围
  • 四、可选操作符
  • 1、否定
  • 2、匹配数值的范围
  • 3、匹配左侧和右侧


一、概念

参考链接:【官网】正则表达式语法

regexp (正则表达式)查询允许您使用正则表达式进行项查询。“项查询” 意味着 Elasticsearch 会将正则表达式应用于由该字段生成的项,而不是字段的原始文本。

二、语法

正则表达式查询由 regexpquery_string 查询支持。

GET <index>/_search
{
  "query": {
    "regexp": {
      "<field>": {
        "value": "<regex>",
        "flags": "ALL",
      }
    }
  }
}

三、标准操作符

标准操作符

作用

示例

.

匹配任意字符

对于字符串 “abcde”,以下正则都匹配:

ab…

a.c.e

*

匹配零个或多个字符

对于字符串 “aaabbb”,以下正则都匹配:

ab

abc*

.bbb.

aaabbb

?

匹配零个或一个字符

对于字符串 “aaabbb”,以下正则都匹配:

aaa?bbb?

aaaa?bbbb?

…?.?

aa?bb?

+

匹配一个或多个字符

对于字符串 “aaabbb”,以下正则都匹配:

a+b+

aa+bb+

a+.+

aa+bbb+

{}

最小最大匹配次数

{5}:重复匹配5次

{2,5}:重复匹配最小2次,最多5次

{2,}:# 重复匹配最小2次

对于字符串 “aaabbb”,以下正则都匹配:

- a{3}b{3}

a{2,4}b{2,4}

a{2,}b{2,}

.{3}.{3}


对于字符串 “aaabbb”,以下正则都不匹配:

a{4}b{4}

a{4,6}b{4,6}

a{4,}b{4,}

[]

匹配字符的范围(匹配方括号中的一个字符)

[abc]:a或b或c

[a-c]:a或b或c

[-abc]:-或a或b或c

[abc\-]:-或a或b或c

[^abc]:不是(a或b或c)

[^a-c]:不是(a或b或c)

[^-abc]:不是(-或a或b或c)

[^abc\-]:不是(-或a或b或c)

对于字符串 “abcb”,以下正则都匹配:

ab[cd]+

[a-d]+


对于字符串 “abcb”,以下正则都不匹配:

[^a-d]+

()

分组

对于字符串 “ababab”,以下正则都匹配:

(ab)+

ab(ab)+

(…)+

(ab)*

abab(ab)?

(ab){3}


对于字符串 “ababab”,以下正则都不匹配:

(…)+

ab(ab)?

(ab){1,2}

1、匹配任意字符

对于字符串 “abcde”,以下正则都匹配:

  • ab…
  • a.c.e
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"abcde"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "ab..."
    }
  }
}

2、匹配一个或多个字符

对于字符串 “aaabbb”,以下正则都匹配:

  • a+b+
  • aa+bb+
  • a+.+
  • aa+bbb+
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"aaabbb"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "aa+bbb+"
    }
  }
}

3、匹配零个或多个字符

对于字符串 “aaabbb”,以下正则都匹配:

  • ab
  • abc*
  • .bbb.
  • aaabbb
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"aaabbb"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "aaa*bbb*"
    }
  }
}

4、匹配零个或一个字符

对于字符串 “aaabbb”,以下正则都匹配:

  • aaa?bbb?
  • aaaa?bbbb?
  • …?.?
  • aa?bb?
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"aaabbb"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "aaaa?bbbb?"
    }
  }
}

5、最小最大匹配次数

正则

描述

{5}

重复匹配5次

{2,5}

重复匹配最小2次,最多5次

{2,}

重复匹配最小2次

对于字符串 “aaabbb”,以下正则都匹配:

  • a{3}b{3}
  • a{2,4}b{2,4}
  • a{2,}b{2,}
  • .{3}.{3}

对于字符串 “aaabbb”,以下正则都不匹配:

  • a{4}b{4}
  • a{4,6}b{4,6}
  • a{4,}b{4,}
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"aaabbb"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "a{2,}b{2,}"
    }
  }
}

6、分组

对于字符串 “ababab”,以下正则都匹配:

  • (ab)+
  • ab(ab)+
  • (…)+
  • (ab)*
  • abab(ab)?
  • (ab){3}

对于字符串 “ababab”,以下正则都不匹配:

  • (…)+
  • ab(ab)?
  • (ab){1,2}
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"ababab"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "(ab){1,2}"
    }
  }
}

7、匹配左侧或右侧

对于字符串 “aabb”,以下正则都匹配:

  • aabb|bbaa
  • aa(cc|bb)
  • a+b+|b+a+
  • a+(b|c)+

对于字符串 “aabb”,以下正则都不匹配:

  • aacc|bb
  • a+|b+
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"aabb"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "aa(cc|bb)"
    }
  }
}

8、匹配字符的范围

正则

描述

[abc]

a或b或c

[a-c]

a或b或c

[-abc]

-或a或b或c

[abc\-]

-或a或b或c

[^abc]

不是(a或b或c)

[^a-c]

不是(a或b或c)

[^-abc]

不是(-或a或b或c)

[^abc\-]

不是(-或a或b或c)

对于字符串 “abcb”,以下正则都匹配:

  • ab[cd]+
  • [a-d]+

对于字符串 “abcb”,以下正则都不匹配:

  • [^a-d]+
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"abcd"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "[a-d]+"
    }
  }
}

四、可选操作符

flags 参数默认为 ALL

flags

开启可选操作符

作用

示例

ALL

所有

COMPLEMENT

~

否定

对于字符串 “abcdef”,以下正则都匹配:

ab~df

ab~cf

a~(cb)def


对于字符串 “abcdef”,以下正则都不匹配:

a(bc)def<br>abcdef

INTERVAL

<>

匹配数值的范围

对于字符串 “x80”,以下正则都匹配:

x<1-100>

x<01-100>


对于字符串 “x80”,以下正则都不匹配:

x<001-100>

INTERSECTION

&

匹配左侧和右侧

对于字符串 “aaabbb”,以下正则都匹配:

aaa.+&.+bbb


对于字符串 “aaabbb”,以下正则都不匹配:

aaa&bbb

ANYSTRING

@

匹配任何整个字符串

1、否定

ab〜cd,必须满足以下条件:

  • “a” 开头
  • 跟在 “b” 后面
  • 后面是任何长度的字符串,除了 “c”
  • “d” 结束

对于字符串 “abcdef”,以下正则都匹配:

  • ab~df
  • ab~cf
  • a~(cb)def

对于字符串 “abcdef”,以下正则都不匹配:

  • a~(bc)def
  • ab~cdef
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"abcdef"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "ab~df"
    }
  }
}

2、匹配数值的范围

对于字符串 “x80”,以下正则都匹配:

  • x<1-100>
  • x<01-100>

对于字符串 “x80”,以下正则都不匹配:

  • x<001-100>
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"x80"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "x<01-100>"
    }
  }
}

3、匹配左侧和右侧

对于字符串 “aaabbb”,以下正则都匹配:

  • aaa.+&.+bbb

对于字符串 “aaabbb”,以下正则都不匹配:

  • aaa&bbb
POST /my_index/_bulk
{"index":{"_id":"1"}}
{"text":"aaabbb"}

GET my_index/_search
{
  "query": {
    "regexp": {
      "text": "aaa.+&.+bbb"
    }
  }
}