POSIX ERE( Extended Regular Expression )

  1. +
  2. ?
  3. |




11. | ( Vertical Bar )

구문 ( Syntax )

<vertical_bar> ::= |
  • 사용 예
    <vertical_bar>
    
    <pattern_expr><vertical_bar>
    
    <vertical_bar><pattern_expr>
    
    <pattern_expr><vertical_bar><pattern_expr>
    

설명 ( 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가 발생한다.
    • ex) |
  • <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 )
    
    


블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,

POSIX ERE( Extended Regular Expression )

  1. +
  2. ?
  3. |




10. ? ( Question Mark )

구문 ( Syntax )

<question_mark> ::= ?
  • 사용 예
    <pattern_expr><question_mark>
    

설명 ( Description )

  • 0 or 1
  • 수량자(quantifier)로, <question_mark> 앞의 <pattern_expr>이 없거나 하나 있음을 의미한다.
    • ex) a? =>  , a
  • <question_mark>만 있는 경우
    • ex) ?
    • 결과
      • Oracle : zero-length match
      • PostgreSQL, MySQL, MariaDB : error 처리
  • zero-length match가 발생할 수 있다.


예제 ( Examples )

SQL> SELECT REGEXP_SUBSTR( 'god', 'goo?d' ) AS RESULT FROM DUAL;

RESULT
--------------------
god

SQL> SELECT REGEXP_SUBSTR( 'good', 'goo?d' ) AS RESULT FROM DUAL;

RESULT
--------------------
good

SQL> SELECT REGEXP_SUBSTR( 'goood', 'goo?d' ) AS RESULT FROM DUAL;

RESULT
--------------------
NULL

SQL> SELECT REGEXP_SUBSTR( 'ababc', '(ab)?' ) AS RESULT FROM DUAL;

RESULT
--------------------
ab

SQL> SELECT REGEXP_SUBSTR( 'knight', '.?night' ) AS RESULT FROM DUAL;

RESULT
--------------------
knight

SQL> SELECT REGEXP_SUBSTR( 'abc', 'z?' ) AS RESULT FROM DUAL;

RESULT
--------------------
NULL

SQL> SELECT REGEXP_COUNT( 'abc', 'z?' ) AS RESULT FROM DUAL;

    RESULT
----------
         4

  • <question_mark>만 있는 경우
    < Oracle >
    SQL> SELECT REGEXP_SUBSTR( 'ab', '?' ) AS RESULT FROM DUAL;
    
    RESULT
    ------------------------------
    NULL
    
    SQL> SELECT REGEXP_COUNT( 'ab', '?' ) AS RESULT FROM DUAL;
    
        RESULT
    ----------
             3
    
    
    < PostgreSQL >
    postgres=# SELECT REGEXP_MATCHES( 'ab', '?', 'g' ) AS RESULT;
    ERROR:  invalid regular expression: quantifier operand invalid
    
    
    < MySQL >
    mysql> SELECT REGEXP_SUBSTR( 'ab', '?' ) AS RESULT;
    ERROR 3688 (HY000): Syntax error in regular expression on line 1, character 1.
    
    
    < MariaDB >
    MariaDB [test]> SELECT REGEXP_SUBSTR( 'ab', '?' ) AS RESULT;
    ERROR 1139 (42000): Got error 'nothing to repeat at offset 0' from regexp
    
    


블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,

Meta Characters

  • 12가지 메타 문자들의 정의 및 스펙을 기술 ( 소괄호 닫기는 소괄호와 같이 묶었기 때문에 항목은 11개 )
  • BRE의 메타문자, ERE에서 추가된 메타문자 순서로 작성
  • 항목별로 구문( Syntax )설명( Description )예제( Examples )
  • 예제는 Oracle DBMS 18c 버전 기준 REGEXP_SUBSTR() 함수를 사용,
    PostgreSQL, MariaDB, MySQL 에서의 Test와 결과가 다른 것은 명시하였음


'매칭한다 ( Matching )'

str을 매칭한다고 함은, 일치한다가 아니라 source string '안'에 해당 패턴이 '포함'됨을 의미한다.
( When I say a regex "matches" a string, I really mean that it matches in a string. )
즉,

'a' match 'cat' X
'a' match in 'cat' O

( Technically, the regex 'a' doesn't match cat, but matches the 'a' in cat. )
혼동에 주의하자!




POSIX BRE( Basic Regular Expression )

  1. ^
  2. $
  3. .
  4. *
  5. \
  6. (
  7. {
  8. [



1. ^ ( Caret )

구문 ( Syntax )

<caret> ::= ^
  • 사용 예
    <caret>
    
    <caret><pattern_expr>
    
    <pattern_expr><caret>
    
    <pattern_expr><caret><pattern_expr>
    

설명 ( Description )

  • source string의 시작을 의미한다.
  • 일반적으로 <caret> 뒤에 <pattern_expr>을 입력하여 사용한다.
    • ex) ^abc
  • <caret> 만 있는 경우, source string의 맨 앞을 매칭한다. ( zero-length match )
    • ex) ^
  • <caret> 앞에 <pattern_expr>이 있는 경우, 어떤 source string과도 매칭하지 않는다.
    • ex) a^
    • 예외
      • ex) a*^bc <=> ^bc
      • ex) a*^ <=> ^


별다른 옵션이 없다면 source string의 시작지점을 매칭하지만, 

multiline mode 옵션이 주어지면 source string의 각 라인 시작지점들을 매칭한다. ( 이 경우, 라인의 기준은 ASCII(10)인 Line Feed(\n)이다. )


예제 ( Examples )

SQL> SELECT REGEXP_SUBSTR( 'abc', '^' ) AS RESULT FROM DUAL;

RESULT
--------------------
NULL

SQL> SELECT REGEXP_COUNT( 'abc', '^' ) AS RESULT FROM DUAL;

    RESULT
----------
         1

SQL> SELECT REGEXP_SUBSTR( 'abc', 'a^' ) AS RESULT FROM DUAL;

RESULT
--------------------
NULL

SQL> SELECT REGEXP_COUNT( 'abc', 'a^' ) AS RESULT FROM DUAL;

    RESULT
----------
         0

SQL> SELECT REGEXP_SUBSTR( 'abc', 'a*^.' ) AS RESULT FROM DUAL;

RESULT
--------------------
a

SQL> SELECT REGEXP_SUBSTR( 'abc', '^a' ) AS RESULT FROM DUAL;

RESULT
--------------------
a

SQL> SELECT REGEXP_SUBSTR( 'abc', '^(.*)' ) AS RESULT FROM DUAL;

RESULT
--------------------
abc

SQL> SELECT REGEXP_SUBSTR( 'abc'||CHR(10)||'def', '^.' ) AS RESULT FROM DUAL;

RESULT
--------------------
a

SQL> SELECT REGEXP_COUNT( 'abc'||CHR(10)||'def', '^.' ) AS RESULT FROM DUAL;

    RESULT
----------
         1

SQL> SELECT REGEXP_SUBSTR( 'abc'||CHR(10)||'def', '^.', 1, 1, 'm' ) AS RESULT FROM DUAL;

RESULT
--------------------
a

SQL> SELECT REGEXP_SUBSTR( 'abc'||CHR(10)||'def', '^.', 1, 2, 'm' ) AS RESULT FROM DUAL;

RESULT
--------------------
d

SQL> SELECT REGEXP_COUNT( 'abc'||CHR(10)||'def', '^', 1, 'm' ) AS RESULT FROM DUAL;

    RESULT
----------
         2


블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,