POSIX ERE( Extended Regular Expression )
- +
- ?
- |
11. | ( Vertical Bar )
구문 ( Syntax )
<vertical_bar> ::= |
설명 ( Description )
- '또는', 'or'를 의미한다.
- 일반적으로, 좌측 <pattern_expr>부터 검사한 뒤, 매칭이 없으면 우측 <pattern_expr>을 검사한다.
- ex) REGEXP_SUBSTR( 'take', '(m|t)ake' ) => take
- ex) REGEXP_SUBSTR( 'aaa', 'aa|aaa' ) => aa
- 예외) PostgreSQL : 예제 확인
- <patten_expr> 중 하나가 empty string일 경우, 제쳐두고 나머지 <pattern_expr>을 우선적으로 매칭한다.
- ex) REGEXP_SUBSTR( 'gdb', '|g' ) => 'g'
- 이 때 그 나머지 <pattern_expr>의 매칭이 없을 경우 zero-length match가 발생한다.
- ex) REGEXP_SUBSTR( 'abc', '|g' ) => zero-length match
- 두 <pattern_expr> 모두 empty string일 경우 zero-length match가 발생한다.
- <pattern_expr>이 string일 경우, 그 string을 다룬다.
- ex) trick|treat => trick or treat ( but not trickreat or trictreat )
예제 ( Examples )
SQL> SELECT REGEXP_SUBSTR( 'abc', 'a|b' ) AS RESULT FROM DUAL;
RESULT
--------------------
a
SQL> SELECT REGEXP_SUBSTR( 'abc', 'b|a' ) AS RESULT FROM DUAL;
RESULT
--------------------
a
SQL> SELECT REGEXP_SUBSTR( 'bbb', 'bb|bbb' ) AS RESULT FROM DUAL;
RESULT
--------------------
bb
SQL> SELECT REGEXP_SUBSTR( 'bbb', 'bbb|bb' ) AS RESULT FROM DUAL;
RESULT
--------------------
bbb
SQL> SELECT REGEXP_SUBSTR( 'ababcdcdcd', '(ab){2}|(cd)+' ) AS RESULT FROM DUAL;
RESULT
------------------------------
abab
SQL> SELECT REGEXP_SUBSTR( 'ababcdcdcd', '(ab){2}|(cd)+', 1, 2 ) AS RESULT FROM DUAL;
RESULT
------------------------------
cdcdcd
SQL> SELECT I1, REGEXP_SUBSTR( I1, '(1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])(st|nd|rd|th)?' ) AS RESULT FROM T1;
I1 RESULT
------------------------------ ------------------------------
12/25 12/25
02/14 02/14
11/26th 11/26th
4/3rd 4/3rd
10/01st 10/01st
SQL> SELECT REGEXP_SUBSTR( 'mississippi', 'mi(s|ss)i(s|ss)i(p|pp)i' ) AS RESULT FROM DUAL;
RESULT
--------------------
mississippi
SQL> SELECT REGEXP_SUBSTR( '801010-1234567',
'[6-9][0-9]([0][1-9]|[1][0-9])([0][1-9]|[1-2][0-9]|[3][0-1])-[1-4][0-9]{6}' ) AS RESULT FROM DUAL;
RESULT
--------------------
801010-1234567
SQL> SELECT REGEXP_SUBSTR( '800010-1234567',
'[6-9][0-9]([0][1-9]|[1][0-9])([0][1-9]|[1-2][0-9]|[3][0-1])-[1-4][0-9]{6}' ) AS RESULT FROM DUAL;
RESULT
--------------------
NULL
SQL> SELECT REGEXP_SUBSTR( '801010-2234567',
'[6-9][0-9]([0][1-9]|[1][0-9])([0][1-9]|[1-2][0-9]|[3][0-1])-[1-4][0-9]{6}' ) AS RESULT FROM DUAL;
RESULT
--------------------
801010-2234567
SQL> SELECT REGEXP_SUBSTR( '801010-5234567',
'[6-9][0-9]([0][1-9]|[1][0-9])([0][1-9]|[1-2][0-9]|[3][0-1])-[1-4][0-9]{6}' ) AS RESULT FROM DUAL;
RESULT
--------------------
NULL
- zero-length match : PostgreSQL로 테스트
postgres=# SELECT REGEXP_MATCHES( 'abc', 'a|', 'g' ) AS RESULT;
result
--------
{a}
{""}
{""}
{""}
(4개 행)
postgres=# SELECT REGEXP_MATCHES( 'abc', '|a', 'g' ) AS RESULT;
result
--------
{a}
{""}
{""}
{""}
(4개 행)
postgres=# SELECT REGEXP_MATCHES( 'abc', 'z|', 'g' ) AS RESULT;
result
--------
{""}
{""}
{""}
{""}
(4개 행)
postgres=# SELECT REGEXP_MATCHES( 'abc', '|z', 'g' ) AS RESULT;
result
--------
{""}
{""}
{""}
{""}
(4개 행)
postgres=# SELECT REGEXP_MATCHES( 'abc', '|', 'g' ) AS RESULT;
result
--------
{""}
{""}
{""}
{""}
(4개 행)