正则表达式语法
edit正则表达式语法
edit一个正则表达式是一种使用占位符字符(称为运算符)来匹配数据中模式的方法。
Elasticsearch 支持在以下查询中使用正则表达式:
Elasticsearch 使用 Apache Lucene 的正则表达式引擎来解析这些查询。
保留字符
editLucene的正则表达式引擎支持所有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\\\\.*" } } }
标准操作符
editLucene的正则表达式引擎不使用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
时,将启用COMPLEMENT
和INTERVAL
操作符。
有效值
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
- 禁用所有可选操作符。
不支持的操作符
editLucene的正则表达式引擎不支持锚定操作符,例如
^
(行首)或 $
(行尾)。要匹配一个词项,正则表达式必须匹配整个字符串。