※*
SELECT REGEXP_COUNT('ac aac abc axyzc abccc', 'a\w*c') C,-- 5 REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w*c', 1, 1) S1,-- ac REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w*c', 1, 2) S2,-- aac REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w*c', 1, 3) S3,-- abc REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w*c', 1, 4) S4,-- axyzc REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w*c', 1, 5) S5,-- abccc REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w*?c', 1, 5) S6-- abc FROM DUAL;
※*等同「a\w{0,}c」預設都是貪婪模式,也就是能匹配多一點就會多匹配一點
※「a\w*?c」或「a\w{0,}?c」為非貪婪,所以S6只有abc
※*、+、?、{}這四個後面多個「?」就是非貪婪模式
※+
SELECT REGEXP_COUNT('ac aac abc axyzc abccc', 'a\w+c') C,-- 4 REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w+c', 1, 1) S1,-- aac REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w+c', 1, 2) S2,-- abc REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w+c', 1, 3) S3,-- axyzc REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w+c', 1, 4) S4-- abccc FROM DUAL;
※+等同「a\w{1,}c」
※?
SELECT REGEXP_COUNT('ac aac abc axyzc abccc', 'a\w?c') C,-- 4 REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w?c', 1, 1) S1,-- ac REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w?c', 1, 2) S2,-- aac REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w?c', 1, 3) S3,-- abc REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a\w?c', 1, 4) S4-- abc FROM DUAL;
※?等同「a\w{0,1}c」
※|
SELECT REGEXP_COUNT('ac aac aBc axyzc abccC', 'a(a|b|B)c') C,-- 3 REGEXP_SUBSTR('ac aac aBc axyzc abccC', 'a(a|b|B)c', 1, 1) S1,-- aac REGEXP_SUBSTR('ac aac aBc axyzc abccC', 'a(a|b|B)c', 1, 2) S2,-- aBc REGEXP_SUBSTR('ac aac aBc axyzc abccC', 'a(a|b|B)c', 1, 3) S3-- abc FROM DUAL;
※|等同「a[abB]c」和「a[=abB=]c」
※.
SELECT REGEXP_COUNT('ac aac aBc axyzc a8ccC', 'a.c') C,-- 3 REGEXP_SUBSTR('ac aac aBc axyzc a8ccC', 'a.c', 1, 1) S1,-- aac REGEXP_SUBSTR('ac aac aBc axyzc a8ccC', 'a.c', 1, 2) S2,-- aBc REGEXP_SUBSTR('ac aac aBc axyzc a8ccC', 'a.c', 1, 3) S3,-- a8c REGEXP_SUBSTR('ac aac abc axyzc abccc', 'a.c', 1, 3) S4-- abc FROM DUAL;
※只能是非貪婪模式,S4可看得出來
※^$
SELECT REGEXP_SUBSTR('a1c' || chr(10) || 'a2c' || chr(10) || 'a3cc' || chr(10) || 'ba4c', '^a.c$', 1, 1, 'm') S1,-- a1c REGEXP_SUBSTR('a1c' || chr(10) || 'a2c' || chr(10) || 'a3cc' || chr(10) || 'ba4c', '^a.c$', 1, 2, 'm') S2,-- a2c REGEXP_SUBSTR('a1c' || chr(10) || 'a2c' || chr(10) || 'a3cc' || chr(10) || 'ba4c', '^a.c$', 1, 3, 'm') S3,-- null REGEXP_SUBSTR('a1c' || chr(10) || 'a2c' || chr(10) || 'a3cc' || chr(10) || 'ba4c', '[a\A].[c\Z]', 1, 3, 'm') S4-- a3c FROM DUAL;
※一整行為尋找的條件,為了要找到更多,所以我用了換行「chr(10)」,並配合m
※\A\Z也是開頭結尾的意思,所以這個也可以這樣用「[a\A].[c\Z]」,但這個是非貪婪模式,所以S4有匹配成功
※英文字、數字、空格
SELECT REGEXP_COUNT('ac aac aBc axyzc abccC', 'a\wc') C1,-- 3 REGEXP_SUBSTR('ac aac aBc axyzc abccC', 'a\wc', 1, 1) S1,-- aac REGEXP_SUBSTR('ac aac aBc axyzc abccC', 'a\wc', 1, 2) S2,-- aBc REGEXP_SUBSTR('ac aac aBc axyzc abccC', 'a\wc', 1, 3) S3,-- abc REGEXP_COUNT('ac a3c aBca5ccC', 'a\dc') C2,-- 2 REGEXP_SUBSTR('ac a3c aBca5ccC', 'a\dc', 1, 1) SD1,-- a3c REGEXP_SUBSTR('ac a3c aBca5ccC', 'a\dc', 1, 2) SD2,-- a5c REGEXP_COUNT('ac a c a cc', 'a\sc') C3,-- 1 REGEXP_SUBSTR('ac a c a cc', 'a\sc', 1, 1) SS1,-- a c REGEXP_SUBSTR('ac a c a cc', 'a\sc', 1, 2) SS2-- a c FROM DUAL;
※a\wc等同「a[a-zA-Z0-9]c」和「a[[:alnum:]]c」
※a\dc,等同「[0-9]」和「a[[:digit:]]c」
※a\sc等同「a c」和「a[ ]c」和「a[[:blank:]]c」
※大寫是相反的意思,如\W是非英文字,\D是非數字;\S非空格
※跳脫字元
SELECT REGEXP_INSTR('\*+?|^$.()[]', '\\') I1,-- 1 REGEXP_INSTR('\*+?|^$.()[]', '\*') I2,-- 2 REGEXP_INSTR('\*+?|^$.()[]', '\+') I3,-- 3 REGEXP_INSTR('\*+?|^$.()[]', '\?') I4,-- 4 REGEXP_INSTR('\*+?|^$.()[]', '\|') I5,-- 5 REGEXP_INSTR('\*+?|^$.()[]', '\^') I6,-- 6 REGEXP_INSTR('\*+?|^$.()[]', '\$') I7,-- 7 REGEXP_INSTR('\*+?|^$.()[]', '\.') I8,-- 8 REGEXP_INSTR('\*+?|^$.()[]', '\(') I9,-- 9 REGEXP_INSTR('\*+?|^$.()[]', '\[') I10-- 11 FROM DUAL;
※如果要比對關鍵字,要在前面多個「\」,「{}」不用
※[::]
這個語法,我在Oracle官網搜尋,並沒有找到全部的語法POSIX的官網在這裡,目前總共有14個,寫得很清楚
我列出10個比較常用和好理解的
[:alnum:] = [a-zA-Z0-9]、\w
[:alpha:] = [a-zA-Z]
[:blank:] = tab和空格
[:digit:] = [0-9]、\d
[:lower:] = [a-z]
[:punct:] = 標點符號
[:space:] = 空格,\s
[:upper:] = [A-Z]
[:word:] = [A-Za-z0-9_],比[:alnum:]多個底線
[:xdigit:] = 十六進制,[0-9a-fA-F]
沒有留言:
張貼留言