給定一個 「正規表示式」 ,回傳哪些文件裡包含符合此 pattern 的 term。
例如:
正規表示式(Regular Expression,常簡寫為 regex、regexp 或 RE),又稱正規表達式、正規表示法、規則運算式、常規表示法,是電腦科學的一個概念。正規表示式使用單個字串來描述、符合一系列符合某個句法規則的字串。
本資料庫使用 Elasticsearch,Elasticsearch 使用 Apache Lucene 的 regular expression engine 來解析這類查詢,它是在 term 這個層級做搜尋,正規表示式必須符合一整個 term。
本資料庫依文本語系不同,對 term 做不同區隔:
文本語系 | term |
---|---|
英、梵、巴、藏轉寫 | word,以空格做為區隔。 |
中文 | 句子,以句點做為區隔。 |
Lucene 的 regular expression engine 支援全部 Unicode 字元,但是下列字元保留做為運算元:
. ? + * | { } [ ] ( ) " \
另外本資料庫也啟用了 Elasticsearch 的 optional operators,下列字元也被保留:
# @ & < > ~
如果要將這些字元當做一般字元使用,可以在前面加上反斜線,或是用雙引號包起來。例如:
@ # 解析為一般字元 '@'
\ # 解析為一般字元 '\'
"john@smith.com" # 解析為 'john@smith.com'
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'⋯⋯等。 |
{}
|
前面的字元,最少、最多可以出現幾次。例如:
|
"|"
|
OR 運算元。例如: abc|xyz # 'abc' 或 'xyz' 都會符合 |
( … )
|
形成一個群組。可以將群組視為表示式之中的單一字元。例如:
|
[ … ]
|
符合中括號內的另一個字元。例如: [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 '-' |
~
|
排除跟在 ~ 後面的字元。例如: 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 必須符合整個字串。