原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/regexp-syntax.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/regexp-syntax.html

正则表达式语法

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

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

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

保留字符

Lucene 的正则表达式引擎支持所有 Unicode 字符。但是,以下字符被保留作为运算符:

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

根据所启用的 可选运算符,以下字符也会被保留:

# @ & < >  ~

要按字面意思使用其中一个字符,请在前面加一个反斜杠对其进行转义,或者用双引号将其括起来。例如:

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

标准运算符

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' 重复2次或更多次
|

或(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'、'-' 的任意字符

可选的运算符

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

要启用多个运算符,请使用 | 分隔符。 例如,flags 值为COMPLEMENT|INTERVAL 表示启用 COMPLEMENTINTERVAL 运算符。

有效值

ALL (默认)
启用所有可选的运算符。
COMPLEMENT

启用 ~ 运算符。 可以用 ~ 来否定最短的跟随模式。例如:

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

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

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

启用 & 运算符,它充当 与(AND) 运算符。 如果左侧和右侧的模式都匹配,则匹配成功。例如:

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

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

可以将 @ 运算符与 &~ 运算符结合起来创建一个“除此之外的一切”逻辑。例如:

@&~(abc.+)  # 匹配除了 'abc' 开头的一切

不支持的运算符

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