2016年4月5日 星期二

正則表達式二 (語法) (DML 十一)

※*

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]

沒有留言:

張貼留言