正则表达式语法
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的正则表达式引擎不支持锚定操作符,例如
^(行首)或 $(行尾)。要匹配一个词项,正则表达式必须匹配整个字符串。