Regex 工具 |
grep |
PowerGREP |
RegexBuddy |
RegexMagic |
一般應用程式 |
EditPad Lite |
EditPad Pro |
語言和函式庫 |
Boost |
Delphi |
GNU (Linux) |
Groovy |
Java |
JavaScript |
.NET |
PCRE (C/C++) |
PCRE2 (C/C++) |
Perl |
PHP |
POSIX |
PowerShell |
Python |
R |
Ruby |
std::regex |
Tcl |
VBScript |
Visual Basic 6 |
wxWidgets |
XML Schema |
Xojo |
XQuery 和 XPath |
XRegExp |
資料庫 |
MySQL |
Oracle |
PostgreSQL |
本網站的更多資訊 |
簡介 |
正規表示式快速入門 |
正規表示式教學 |
替換字串教學 |
應用程式和語言 |
正規表示式範例 |
正規表示式參考 |
替換字串參考 |
書籍評論 |
可列印 PDF |
關於本網站 |
RSS Feed 和部落格 |
從 10g 第 1 版開始,Oracle Database 提供 4 個 regexp 函數,您可以在 SQL 和 PL/SQL 陳述式中使用。這些函數實作 POSIX 延伸正規表示式 (ERE) 標準。Oracle 完全支援 校對順序 和 等價類別,用於 方括號表示式。NLS_SORT 設定會決定所使用的 POSIX 區域設定,而區域設定會決定可用的校對順序和等價類別。
不過,Oracle 並未完全實作 POSIX ERE 標準。它在三個方面有所不同。首先,Oracle 支援正規表示式中 \1 到 \9 的 反向參照。POSIX ERE 標準不支援這些,儘管 POSIX BRE 支援。在完全相容的引擎中,\1 到 \9 會是非法的。POSIX 標準指出,使用反斜線來跳脫非元字元的字元是非法的。Oracle 允許這樣做,並只會忽略反斜線。例如,\q 在 Oracle 中與 q 相同。結果是所有 POSIX ERE 正規表示式都可以在 Oracle 中使用,但一些在 Oracle 中有效的正規表示式可能會在完全相容 POSIX 的引擎中造成錯誤。顯然地,如果您只使用 Oracle,這些差異就無關緊要。
第三個差異比較細微。它不會造成任何錯誤,但可能會導致不同的比對。正如我在 POSIX 標準 主題中所解釋的,它要求 regex 引擎在交替的情況下傳回最長的比對。Oracle 的引擎不會這樣做。它是一個 傳統 NFA 引擎,就像本網站上討論的所有非 POSIX regex 風格一樣。
如果您曾在其他程式語言中使用過正規表示式,請注意 POSIX 不支援非可列印字元的跳脫字元,例如 tab 的 \t 或換行符號的 \n。您可以在 C++ 等程式語言的 POSIX 引擎中使用這些字元,因為 C++ 編譯器會將字串常數中的 \t 和 \n 解釋為 tab 和換行符號。在 SQL 陳述式中,您需要在字串中輸入實際的 tab 或換行符號,並搭配您的正規表示式才能與 tab 或換行符號相符。Oracle 的正規表示式引擎會將字串 '\t' 解釋為正規表示式 t,當傳遞為 regexp 參數時。
Oracle 10g R2 進一步擴充正規表示式語法,新增了 自由間隔模式(不支援註解)、簡寫字元類別、惰性量詞,以及 錨點 \A、\Z 和 \z。Oracle 11g 和 12c 使用與 10g R2 相同的正規表示式風格。
Oracle Database 10g 提供四個正規表示式函式。您可以在 SQL 和 PL/SQL 陳述式中平等地使用這些函式。
REGEXP_LIKE(source, regexp, modes) 可能會是您最常使用的一個。您可以在 SELECT 陳述式的 WHERE 和 HAVING 子句中使用它。在 PL/SQL 腳本中,它會傳回一個布林值。您也可以在 CHECK 約束中使用它。source 參數是正規表示式應該與之相符的字串或欄位。regexp 參數是包含正規表示式的字串。modes 參數是選用的。它設定相符模式。
SELECT * FROM mytable WHERE REGEXP_LIKE(mycolumn, 'regexp', 'i');
IF REGEXP_LIKE('subject', 'regexp') THEN /* Match */ ELSE /* No match */ END IF;
ALTER TABLE mytable ADD (CONSTRAINT mycolumn_regexp CHECK (REGEXP_LIKE(mycolumn, '^regexp$')));
REGEXP_SUBSTR(source, regexp, position, occurrence, modes) 傳回一個字串,其中包含由正規表示式相符的 source 部分。如果相符嘗試失敗,則傳回 NULL。您可以將 REGEXP_SUBSTR 與單一字串或欄位一起使用。您可以在 SELECT 子句中使用它,以僅擷取欄位的特定部分。position 參數指定相符嘗試應該開始的來源字串中的字元位置。第一個字元的位址為 1。occurrence 參數指定要取得哪個相符。設定為 1 以取得第一個相符。如果您指定較高的數字,Oracle 會繼續嘗試從前一個相符的結尾開始相符正規表示式,直到找到與您指定的相符數目一樣多的相符。然後傳回最後一個相符。如果相符數目較少,則傳回 NULL。請勿將此參數與 反向參照 混淆。Oracle 未提供函式來傳回由擷取群組相符的字串部分。最後三個參數是選用的。
SELECT REGEXP_SUBSTR(mycolumn, 'regexp') FROM mytable;
match := REGEXP_SUBSTR('subject', 'regexp', 1, 1, 'i')
REGEXP_REPLACE(source, regexp, replacement, position, occurrence, modes) 傳回來源字串,其中一個或所有正規表示式相符都已取代。如果找不到相符,則取代原始字串。如果您為 occurrence 指定正數(請參閱上段),則只會取代該相符。如果您指定零或略過參數,則會取代所有相符。最後三個參數是選用的。replacement 參數是每個正規表示式相符都會被取代的字串。您可以在取代文字中使用 反向參照 \1 到 \9,以重新插入由擷取群組相符的文字。您可以多次參照同一個群組。沒有取代文字代碼可以重新插入整個正規表示式相符。若要執行此操作,請在整個正規表示式中加上括號,並在取代中使用 \1。如果您想要插入文字 \1,請使用字串 '\\1'。只有在反斜線後接數字或另一個反斜線時,才需要跳脫反斜線。若要插入文字 \\,請使用字串 '\\\\'。雖然 SQL 不要求在字串中跳脫反斜線,但 REGEXP_REPLACE 函式需要。
SELECT REGEXP_REPLACE(mycolumn, 'regexp', 'replacement') FROM mytable;
result := REGEXP_REPLACE('subject', 'regexp', 'replacement', 1, 0, 'i');
REGEXP_INSTR(來源, 正規表示式, 位置, 出現次數, 回傳選項, 模式) 回傳來源字串中正規表示式比對的開頭或結尾位置。此函式採用與 REGEXP_SUBSTR 相同的參數,再加一個。設定 return_option 為零或省略參數,以取得比對中第一個字元的位址。設定為一,以取得比對後第一個字元的位址。字串中的第一個字元為位址 1。如果找不到比對,REGEXP_INSTR 會回傳零。最後 4 個參數為選用。
SELECT REGEXP_INSTR(mycolumn, 'regexp', 1, 1, 0, 'i') FROM mytable;
REGEXP_COUNT(來源, 正規表示式, 位置, 模式) 回傳正規表示式可以在來源字串中比對到的次數。如果正規表示式完全找不到比對,則會回傳零。此函式僅在 Oracle 11g 及更新版本中提供。
SELECT REGEXP_COUNT(mycolumn, 'regexp', 1, 'i') FROM mytable;
四個正規表示式函式所接受的 modes 參數應為包含最多三個字元的字串,共四個可能的字元。例如,'i' 會開啟不分大小寫的比對,而 'inm' 會開啟這三個選項。'i' 和 'c' 互斥。如果您省略此參數或傳遞空字串,則會使用預設的比對模式。
O’Reilly 的書籍 Oracle Regular Expressions Pocket Reference 是一本非常實用的 64 頁書籍,告訴您在 Oracle 資料庫 10g 中關於正規表示式需要知道的一切。儘管書的封面,它實際上包含教學和參考。由於 Oracle 的正規表示式支援相當有限,因此這本小書是您成功使用 Oracle 正規表示式所需的一切。
我的 Oracle Regular Expressions Pocket Reference 書籍評論
| 快速開始 | 教學 | 工具與語言 | 範例 | 參考 | 書籍評論 |
| grep | PowerGREP | RegexBuddy | RegexMagic |
| EditPad Lite | EditPad Pro |
| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery 與 XPath | XRegExp |
| MySQL | Oracle | PostgreSQL |
頁面網址:https://regular-expressions.dev.org.tw/oracle.html
頁面最後更新:2021 年 8 月 24 日
網站最後更新:2024 年 3 月 15 日
版權所有 © 2003-2024 Jan Goyvaerts。保留所有權利。