正则表达式语法

edit

正则表达式语法

edit

一个正则表达式是一种使用占位符字符(称为运算符)来匹配数据中模式的方法。

Elasticsearch 支持在以下查询中使用正则表达式:

Elasticsearch 使用 Apache Lucene 的正则表达式引擎来解析这些查询。

保留字符

edit

Lucene的正则表达式引擎支持所有Unicode字符。然而,以下字符被保留为操作符:

. ? + * | { } [ ] ( ) " \

根据启用的可选操作符,以下字符也可能被保留:

# @ & < >  ~

要按字面意思使用这些字符之一,请在其前面加上反斜杠或用双引号将其括起来。例如:

\@                  # renders as a literal '@'
\\                  # renders as a literal '\'
"john@smith.com"    # renders as 'john@smith.com'

反斜杠在JSON字符串和正则表达式中都是转义字符。在查询中,你需要对两个反斜杠进行转义,除非你使用的是语言客户端,它会处理这个问题。例如,字符串 a\b 需要被索引为 "a\\b"

PUT my-index-000001/_doc/1
{
  "my_field": "a\\b"
}

本文档匹配以下 regexp 查询:

GET my-index-000001/_search
{
  "query": {
    "regexp": {
      "my_field.keyword": "a\\\\.*"
    }
  }
}

标准操作符

edit

Lucene的正则表达式引擎不使用Perl兼容正则表达式(PCRE)库,但它确实支持以下标准操作符。

.

匹配任意字符。例如:

ab.     # 匹配 'aba', 'abb', 'abz', 等。
?

重复前面的字符零次或一次。通常用于使前面的字符变为可选。例如:

abc?     # 匹配 'ab' 和 'abc'
+

重复前面的字符一次或多次。例如:

ab+     # 匹配 'ab', 'abb', 'abbb', 等等。
*

重复前面的字符零次或多次。例如:

ab*     # 匹配 'a', 'ab', 'abb', 'abbb', 等等。
{}

前一个字符可以重复的最小和最大次数。例如:

a{2}    # 匹配 'aa'
a{2,4}  # 匹配 'aa', 'aaa', 和 'aaaa'
a{2,}   # 匹配 'a' 重复两次或更多次
|

OR 运算符。如果左侧或右侧的最长模式匹配,则匹配将成功。例如:

abc|xyz  # 匹配 'abc' 和 'xyz'
( … )

形成一个组。您可以使用组将表达式的一部分视为单个字符。例如:

abc(def)?  # 匹配 'abc' 和 'abcdef' 但不匹配 'abcd'
[ … ]

匹配括号中的任意一个字符。例如:

[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', 或 '-' 之外的任意字符

可选操作符

edit

您可以使用 flags 参数为 Lucene 的正则表达式引擎启用更多可选操作符。

要启用多个操作符,请使用|分隔符。例如,flags值为COMPLEMENT|INTERVAL时,将启用COMPLEMENTINTERVAL操作符。

有效值

edit
ALL (Default)
启用所有可选操作符。
"" (empty string)
别名为 ALL 值。
COMPLEMENT

启用 ~ 运算符。您可以使用 ~ 来否定紧随其后的最短模式。例如:

a~bc   # 匹配 'adc' 和 'aec' 但不匹配 'abc'
EMPTY

启用 #(空语言)操作符。# 操作符不匹配任何字符串,甚至不匹配空字符串。

如果你通过编程方式组合值来创建正则表达式,你可以传递#来指定“无字符串”。这可以让你避免意外匹配空字符串或其他不需要的字符串。例如:

#|abc  # 匹配 'abc' 但其他任何内容都不匹配,甚至不匹配空字符串
INTERVAL

启用 <> 运算符。您可以使用 <> 来匹配数值范围。例如:

foo<1-100>      # 匹配 'foo1', 'foo2' ... 'foo99', 'foo100'
foo<01-100>     # 匹配 'foo01', 'foo02' ... 'foo99', 'foo100'
INTERSECTION

启用 & 运算符,该运算符作为 AND 运算符。如果左侧和右侧的模式都匹配,则匹配将成功。例如:

aaa.+&.+bbb  # 匹配 'aaabbb'
ANYSTRING

启用 @ 运算符。您可以使用 @ 来匹配任何整个字符串。

您可以将 @ 运算符与 &~ 运算符结合使用,以创建“排除所有”逻辑。例如:

@&~(abc.+)  # 匹配除以 'abc' 开头的词项以外的所有内容
NONE
禁用所有可选操作符。

不支持的操作符

edit

Lucene的正则表达式引擎不支持锚定操作符,例如 ^(行首)或 $(行尾)。要匹配一个词项,正则表达式必须匹配整个字符串。