本地英文版地址: ../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
表示启用 COMPLEMENT
和 INTERVAL
运算符。
有效值
-
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 的正则表达式引擎不支持定位符,比如 ^
(行首)或 $
(行尾)。
要匹配某个词项,正则表达式必须匹配整个字符串。