Regexp query

給定一個 「正規表示式」 ,回傳哪些文件裡包含符合此 pattern 的 term。

例如:

正規表示式(Regular Expression,常簡寫為 regex、regexp 或 RE),又稱正規表達式、正規表示法、規則運算式、常規表示法,是電腦科學的一個概念。正規表示式使用單個字串來描述、符合一系列符合某個句法規則的字串。

一、搜尋範圍

本資料庫使用 Elasticsearch,Elasticsearch 使用 Apache Lucene 的 regular expression engine 來解析這類查詢,它是在 term 這個層級做搜尋,正規表示式必須符合一整個 term。

本資料庫依文本語系不同,對 term 做不同區隔:

文本語系 term
英、梵、巴、藏轉寫 word,以空格做為區隔。
中文 句子,以句點做為區隔。

二、正規表示式 語法 (Regular expression syntax)

(一)保留字元 (Reserved characters)

Lucene 的 regular expression engine 支援全部 Unicode 字元,但是下列字元保留做為運算元:

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

另外本資料庫也啟用了 Elasticsearch 的 optional operators,下列字元也被保留:

# @ & < >  ~

如果要將這些字元當做一般字元使用,可以在前面加上反斜線,或是用雙引號包起來。例如:

@                  # 解析為一般字元 '@'
\                  # 解析為一般字元 '\'
"john@smith.com"    # 解析為 'john@smith.com'

(二)標準運算元 (Standard operators)

Lucene 的 regular expression engine 不使用 Perl Compatible Regular Expressions (PCRE) library,而是支援下列標準運算元。

.

符合任意字元。例如:

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'

在中括號之內,半形減號 - 表示範圍,除非 - 是第一個字元,或是有加反斜線 (escaped)。例如:

[a-c]   # 符合 'a', 'b', 或 'c'
[-abc]  # '-' 是第一個字元。符合 '-', 'a', 'b', 或 'c'
[abc\-] # '-' 之前加了反斜線 (escaped). 符合 'a', 'b', 'c', 或 '-'

中括號內的 ^ 字元表示否定後面的字元或範圍。例如:

[^abc]      # 符合任意字元,除了 'a', 'b', 或 'c'
[^a-c]      # 符合任意字元,除了 'a', 'b', 或 'c'
[^-abc]     # 符合任意字元,除了 '-', 'a', 'b', 或 'c'
[^abc\-]    # 符合任意字元,除了 'a', 'b', 'c', or '-'

(三)選用運算元 (Optional operators)

~

排除跟在 ~ 後面的字元。例如:

a~bc   # 符合 'adc' 以及 'aec',但是不符合 'abc'
<>

數字範圍。例如:

foo<1-100>      # 符合 'foo1', 'foo2' ... 'foo99', 'foo100'
foo<01-100>     # 符合 'foo01', 'foo02' ... 'foo99', 'foo100'
&

AND 運算元。在運算元的左右兩側的 pattern 都要符合。例如:

aaa.+&.+bbb  # 符合 'aaabbb'
@

可以使用 @ 來 match 任何完整的字串。

將 @ 運算元與 & 以及 ~ 運算結合,可以達到「任何東西除了」這樣的邏輯。例如:

@&~(abc.+)  # 符合任何東西,除了開頭是 'abc' 的 term

(四)不支援的運算元

Lucene 的 regular expression engine 不支援 anchor operators,例如 ^ (行首) 或 $ (行末)。
要 match 一個 term,regular expression 必須符合整個字串。