이 글에서는 SingleStoreDB 에서 지원하는 정규표현식(Regular Expression)의 한 사례에 대해 알아 보겠습니다.
다음과 같은 경우에 정규표현식을 이용해 어떻게 BTAG 와 ETAG 사이에 있는 항목값 만을 추출할 수 있을까요?
...BTAG?항목값?ETAG...
가장 쉬운 방법은 (...BTAG?)(항목값 패턴)(?ETAG...) 이렇게 3개의 그룹으로 묶어 Back Reference 를 이용해 두번째 Group 만 추출하면 됩니다.
예를 들어 Oracle 의 경우에는 regexp_substr 함수를 사용해서 아래와 같이 수행합니다.
select regexp_substr('BTAG?dummy1 dummy2 abcBTAG?Boom?ETAG000011111',
'(.*BTAG\?)(\w*)(\?ETAG.*)',
1, 1, 'i', 2) as extracted
from dual;
EXTR
----
Boom
또는 regexp_replace 함수를 이용하여 두번째 Back Reference (\2) 만 남기고 나머지를 null 로 치환해도 됩니다.
select regexp_replace('BTAG?dummy1 dummy2 abcBTAG?Boom?ETAG000011111',
'(.*BTAG\?)(\w*)(\?ETAG.*)',
'\2', 1, 1 ) as extracted
from dual;
EXTR
----
Boom
MySQL 에서는 ERE(Extended Regular Expression) 만 지원하기 때문에 위와 같은 Back Reference 를 사용할 수 없는 것으로 알고 있습니다.
SingleStoreDB 는 ERE 뿐만 아니라 ARE(Advanced Regular Expression) 도 지원하기 때문에 regexp_replace 를 이용해 동일한 문제를 해결할 수 있습니다.
singlestore> set global regexp_format='advanced';
Query OK, 0 rows affected (0.01 sec)
singlestore> select regexp_replace('BTAG?dummy1 dummy2 abcBTAG?Boom?ETAG000011111',
-> '(.*BTAG\\?)(\\w*)(\\?ETAG.*)',
-> '\\2' ) as extracted;
+-----------+
| extracted |
+-----------+
| Boom |
+-----------+
1 row in set (0.01 sec)
지금까지 SingleStoreDB 의 ARE 를 이용해 정규표현식을 활용하는 간단한 예제를 설명드렸습니다.
감사합니다.