본문 바로가기

oracle10R2

SQL Regular expression

 

정규현식(Regular expression)

 

: 치시킬 어떤 있는 호와 원소 합으로 매우 강력 용적인 패턴 매칭법이다.

- POSIX 법을 른다.

 

- 치와 검색을 정의하는 타기호 조합으로 루어진.

 

- 소문자를 구분.

 

 

 

[자주 쓰는 메타기호]

 

* : 0 이상

 

ex) Ad* Ada, Adb, Adcbdd 되지만 Acd, add 치되지 .

 

? : 글자 나와 매치

 

ex) A?c Aac, AAc, Adc 지만 Bcc, zzc 되지 않는.

 

^ : 라인의 시작부분

 

ex) ^abc abch 매치되지만 habc 와는 매치 는다.

 

$ : 라인의 끝부분

 

ex) Abc$ Abc 되지만 Abcadd 와는 되지 않는. [] : 문자 중에 나와 매치

ex) A[a-c]b Aab, Acb 매치지만 Abcadd 와는 되지 않는.

 

{m} : m 나타남

 

ex) Myname[0-9]{3} Myname9, Myname99, Myname222 치되, Myname2222 와는 매치되지 는다.

{m,n} : m , n 이하 나타.

 

ex) Myname[0-9]{3,5} Myname9, Myname99, Myname2222 치되지, Myname222222(2 6 )와는 매치되지 않는.

n : 백레런스라고 . 이전 현식을 n 반복.

 

ex) [aeiou]2 aaron 치되, aron 매치되지 는다.


 

10g 정규

 

: 10g 가지 로운 함수를 통해 정규현식을 한다.

 

 

 

1. regexp_like 함수

 

: SQL like 산자와 비슷한 식의 like 확장한 것이다.

입력으 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, NCLOB type 올수 .

 

- 구별을 하지 않도록 하는 옵션 있음

 

- 여러 걸쳐있는 자열 검색 가능

 

- 표현 NULL 경우 정의 (unknown value) 반환.

 

 

 

: regexp_like(search_string, pattern [, match_option]);

 

 

 

search_string : 검색할 문장

 

pattern : 정규표식(512byte 이하)

 

match_option : 매칭 법을 결정 션(문자열) C : 문자 (default),

| : 문자 , N :

 

.(period) 개행문(newline)와도 매치됨,

 

M : 하는 열을 인으로 간주. 10g 에서 ^,$ 자열의 시작과 끝에 매치키지 않고 되도록 .

 

 

[ex.]

 

SQL> DESC test_expressions

 

NameNull?Type

 

----------------------------------------------- CHAR_VALUEVARCHAR2(30)

DATE_VALUEDATE

 

 

 

SQL> SELECT * FROM test_expressions;
CHAR_VALUEDATE_VALUE

-----------------------------------------------


 

abcd27-DEC-03

 

abb27-DEC-03 zzz27-DEC-02 zbz30-JUN-03 zabz30-JUN-03 aaron30-JUN-03

 

 

> CHAR_VALUE column ab 시작 검색

 

SQL> SELECT * FROM test_expressions WHERE REGEXP_LIKE(char_value, '^ab*');
CHAR_VALUEDATE_VALUE

-----------------------------------------------
abcd27-DEC-03

abb27-DEC-03

 

 

 

> b 검색

 

SQL> SELECT * FROM test_expressions WHERE REGEXP_LIKE(char_value, '^.b.');
CHAR_VALUEDATE_VALUE

-----------------------------------------------
abcd27-DEC-03

abb27-DEC-03 zbz30-JUN-03

 

 

> : to_char 함수 문자 (8 이터)
SQL> SELECT TO_CHAR(date_value, 'mm/dd/yyyy hh24:mi:ss')

FROM test_expressions

 

WHERE REGEXP_LIKE(TO_CHAR(date_value, 'yyyy/mi'), '200[2-3]/08');
TO_CHAR(DATE_VALUE)

---------------------

 

12/27/2003 12:08:36

 

12/27/2003 12:08:43

 

12/27/2002 12:08:51


 

06/30/2003 12:08:59

 

 

 

> 문자 타나 (z a 복되 경우)
SQL> SELECT char_value FROM test_expressions

WHERE REGEXP_LIKE(char_value, '(([za]))/2', 'i');
CHAR_VALUE

------------
aaron

zzz

 

  

2. regexp_instr 함수

 

:  instr   확장한  것으로  정규표현식을  용해    문장을  색한다.  return_option 설정에 따라 하는
부분의 시작 , 끝 위치를 환해 준다. 력으로는 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, NCLOB type .
정규표식이 NULL 인 경우 의되지 않은 값을 환한다.

 

 

: redexp_instr(search_string, pattern [, position [, occurrence

 

[, return_option [, match_option]]]]);

 

 

 

search_string : 검색할 문장

 

pattern : 정규표식(512byte 이하)

 

position : 어디서 검색할 지를 나타 , 기본 1 .

 

occurrence : 패턴의 출연 횟수.

 

기본값은 1 이며 경우 처음 분을 는다.

 

return_option : 0 치되는 부분의 시작 부분을 하며, 0 우에는 끝 (검색 자열 ) 환된.

match_option : 매칭 법을 결정 (문자).

 

 

 

[ex.]

 

> b 이터 표현 용하 검색

 

SQL> SELECT * FROM test_expressions

 

WHERE REGEXP_INSTR(char_value, 'b', 1, 2, 0) > 0;


 

CHAR_VALUEDATE_VALUE

 

-------------------------------------
abb27-DEC-03

 

 

> b c 자열 검색

 

SQL> SELECT * FROM test_expressions

 

WHERE REGEXP_INSTR(char)value, '[b-c]', 1, 2, 0) > 0;
 CHAR_VALUEDATE_VALUE

-----------------------------------------------
abcd27-DEC-03

abb27-DEC-03

 

 

 

> 반환

 

: 반환 위치는 자열 다음 글자 치를 결과로 반환

 

SQL> SELECT REGEXP_INSTR('This is a test', '[^ ]+', 1, 2) FROM dual;

REGEXP_INSTR('This is a test', '[^ ]+', 1, 2)

 

------------------------------------

 

6

 

 

 

3. regexp_replace 함수

 

:  replace  함수의  확장판으로  정규표현식을  용해    문장을  색하고  매치되는  부분을 다른 문자열로 바꿔서 환해 준.
입력값로는 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, NCLOB type .

 

 

: regexp_replace(search_string, pattern [, replacestr [, position [, occurrence

 

[, match_option]]]]);

 

 

 

search_string : 검색할 문장

 

pattern : 정규표식(512byte 이하)

 

replacestr : 분과 대체될 문자열

 

 

[ex]

 

> This is the wild west west -> This is the wild west dude

 

SQL> SELECT REGEXP_REPLACE ('this is the wild west', 'west$', 'dude') FROM dual;

REGEXP_REPLACE ('THIS IS THE WILD WEST')

 

---------------------------------------
this is the wild west dude

 

 

> 문자(-) 침표(.)

 

SQL> SELECT REGEXP_REPLACE ('206-555-1212',

 

'([[:digit:]]{3})-([[:digit:]]{4}', '1.2.3') FROM dual;

REGEXP_REPALCE

 

---------------

 

206.555.1212

 

 

 

----> [:digit:] : 자를 표기하기 정의

 

[[:digit:]]{3} [0-9]{3} 표현

 

4. regexp_substr 함수

 

: substr 수의 확장으로 정규현식을 색한 문자열의 분문자(substring)을 반환한. regexp_instr 함수는 문열의
, 끝 위 regexp_substr 함수는 실제 자열 결과값으 반환. 입력으 CHAR, VARCHAR2, NCHAR,
NVARCHAR2, CLOB, NCLOB type
.

 

 

: regexp_substr(search_string, pattern [, position [, occurrence [, match_option]]]]);

 

 

 

search_string : 검색할 문장

 

pattern : 정규표식(512byte 이하)

 

position : 어디서 검색할 지를 나타 로, 기본 1 .

 

occurrence : 패턴의 출연 횟수.

 

[ex]

 

> b 찾기

 

SQL> SELECT REGEXP_SUBSTR(char_value, 'b', 1, 2) FROM test_expressions

WHERE REGEXP_INSTR(char_vaule, 'b', 1, 2) >0;
REGEXP_SUBSTR(CAHR_VALUE)

--------------------------
b

 

 > b c 문자 어있 데이 b, c, d 이루 출력 SQL> SELECT char_value,
REGEXP_SUBSTR(char_value, '([b-d]+∕?) {0, 5}?') FROM test_expressions

WHERE REGEXP_INSTR(char_value, '[b-c]' 1, 2) > 0;
CHAR_VALUEREGEXP_VALUE

----------------------------------------
abcdbcd

abbbb

 

정규표현식의 문법

 

정규표식은 트웨 라서 식이나 지원 범위가 다를 습니.

 

 

^The”

"The" 하는 문자열

"of despair$"

"of despair" 나는 자열

"^abc$"

"abc" 하고 "abc" ("abc"  자열도 해당)

"notice"

"notice"

 

 

"ab*"

a  다음에 b 0 이상 ("a", "ab", "abbb",  )

"ab+"

a  다음에 b 1 이상 ("ab", "abbb",  )

"ab?"

a  다음에 b (ab 또는 a)

 

 

"ab{2}"

a  다음에 b 2 있는 자열 ("abb")

"ab{2,}"

a  다음에 b 2 이상 ("abb", "abbbb",  .)

"ab{3,5}"

a  다음에 b 3개에서 5 사이 ("abbb", "abbbb",   "abbbbb")

'*', '+', '?' 각각 "{0,}", "{1,}", "{0,1}" 같습니.

 

 

( ) 문자 사용

"a(bc)*"

a  다음에 bc 0 이상 (묶음 )

"a(bc){1,5}"

a  다음에 bc 1개에서 5 사이

 

 

"hi|hello"

"hi" "hello" 있는

() "(b|cd)ef"

"bef"  또는 "cdef"

() "(a|b)*c"

a b 러번 타나고 c 붙어있는 패턴

 

 

. ()                             임의의 문자

ex) "^.{3}$"                  3로만 되어 자열

 

 

[]  괄호 있는 의의 문자

[]  문자로 ^ 쓰면 내용의 부정 괄호 함되지 않는 문자

"[ab]"

a  또는 b ("a|b" )

"[a-d]"

소문자 'a' 'd' ("a|b|c|d" "[abcd]" )

() "^[a-zA-Z]"

영문자로 작하는

() "[0-9]%"

%  문자 있는 패턴

() "%[^a-zA-Z]%"

% 문자 사이에 자가 없는 패턴


 

특수 문자 체를 검색 하기

\^

^

 

\.

.

\[

[

\$

$

\(

(

\)

)

\|

|

\*

*

\+

+

\?

?

\{

{

\\

\

\n

줄넘김

\r

리턴문자

\w

알파벳과 _ (밑줄)

\W

알파벳과 _ 아닌

\s

공간

\S

간이

\d

숫자

\D

숫자가 아닌

\b

단어와 단어 사이의 경계

\B

단어 사이의 경계가 아닌

\t

Tab문자

\xnn

16진수 nn 하는 문자

 

 

[ ]  에서는 특수 문자가 모두 효력을 잃게 됩니.

 

 

검색 + 치환 (분식)

( ) 둘러싼 부분은 각각 하나의 리로 취급,  검색시 ( )  안에 되는 내용

경할 내용 대로 져다 이용 습니.   각각 (  )안에 해당되는 용은 변경할 에서 $1, $2, ..  해서 있습니.

예제) mp3

검색 : (.*) - (.*)\.mp3       .* 이에 관없이 자열, \.

치환 : $2 - $1.mp3          에서 검색한 ( )안에 되는 내용

ex) " - 연주자.mp3" "주자 - 제목.mp3"

앞에서 부식을 다시 활용 (제가 해한 )

\n ( )  하부 에서 n번째 하부 리킵.

예제) (.+)\1+

\1로 되어 있으니까 번째 분식 (.+)를 가킵니다. 위 내용을 해하자면, 일단 (.+)가 있으니까 해당 내용을 ,  \1+ 있으니까 부분식 (.+) 똑같은 내용이 그 1 이상 있는 자열을 니다.

예제)  abab 문자 위에 당되는데,   (.+)   의의 문자열 ab 찾고 뒤에

\1+ 분식을 다시 1 것을 니까 ab 이에 합니.

 

 

변경자 검색 변경

(?i)

대소문자 ()

(?-i)

대소문자 구분

(?g)

"greedy"  드로 전환 (기본)

(?-g)

"greedy"  ,  라서 "+" "+?" 동일한 인식

 
============================================================

Regular_Exp_LAB

================================================================================

Code Listing 1: Finding phone numbers in the park descriptions

SQL> SELECT park_name, description
     FROM michigan_park
     WHERE REGEXP_LIKE(description, '...-....');

Mackinac Island State Park
Michigan's first state park encompasses approximately 1800 acres
of Mackinac Island. The centerpiece is Fort Mackinac, built in 1780 by
the British to protect the Great Lakes Fur Trade. For information by
phone, dial 800-44-PARKS or 517-373-1214.

Fort Wilkens State Park
Located almost at the very tip of the Keewenaw Peninsula,
Fort Wilkens is a restored army fort built during the copper rush.
Camping is available. For the modern campground, phone (800) 447-2757. For
group-camping, phone 906.289.4215. For information on canoe, kayak, and
other boat rentals, call the concession office at (906) 289-4210.

Muskallonge Lake State Park
A 217-acre park located on the site of an old lumber town, Deer Park.
Shower and toilet facilities are available, as are campsites with
electricity.

Porcupine Mountains State Park
Michigan's largest state park consists of some 60,000 acres
of mostly virgin timber. Over 90 miles of trails are available
to backpackers and hikers. Downhill skiing is available in winter.
Rustic cabins are available. To reserve a cabin, call (906) 885-5275.

=================================================================================

Code Listing 2: Increasing the constraints on the phone number pattern
SQL> SELECT park_name, description
     FROM michigan_park
     WHERE REGEXP_LIKE(description, '[0-9]{3}[-.][0-9]{4,4}');

Mackinac Island State Park
Michigan's first state park encompasses approximately 1800 acres
of Mackinac Island. The centerpiece is Fort Mackinac, built in 1780 by
the British to protect the Great Lakes Fur Trade. For information by
phone, dial 800-44-PARKS or 517-373-1214.

Fort Wilkens State Park
Located almost at the very tip of the Keewenaw Peninsula,
Fort Wilkens is a restored army fort built during the copper rush.
Camping is available. For the modern campground, phone (800) 447-2757. For
group-camping, phone 906.289.4215. For information on canoe, kayak, and
other boat rentals, call the concession office at (906) 289-4210.

Porcupine Mountains State Park
Michigan's largest state park consists of some 60,000 acres
of mostly virgin timber. Over 90 miles of trails are available
to backpackers and hikers. Downhill skiing is available in winter.
Rustic cabins are available. To reserve a cabin, call (906) 885-5275.

Tahquamenon Falls State Park
One of the largest waterfalls east of the Mississippi is found
within this park's 40,000+ acres. Upper Tahquamenon Falls is some 50 feet
high, 200 feet across, and supports a flow that has been known to reach
50,000 gallons/second. The park phone is 906.492.3415.

=================================================================================

Code Listing 3: Constraining the phone number column

SQL> ALTER TABLE michigan_park
     ADD (CONSTRAINT phone_number_format
          CHECK (REGEXP_LIKE(park_phone,
          '^\([[:digit:]]{3}\) [[:digit:]]{3}-[[:digit:]]{4}$')));

Table altered.

SQL> INSERT INTO michigan_park (park_name, park_phone)
     VALUES ('Warren Dunes State Park','616.426.4013');

INSERT INTO michigan_park (park_name, park_phone)
*
ERROR at line 1:

ORA-02290: check constraint (TK32VP.PHONE_NUMBER_FORMAT) violated

SQL> INSERT INTO michigan_park (park_name, park_phone)
     VALUES ('Warren Dunes State Park','(616) 426-4013');

=================================================================================

Code Listing 4: Regularizing the format of the phone numbers

SQL> UPDATE michigan_park
     SET description = REGEXP_REPLACE(description,
                       '([[:digit:]]{3})[-.]([[:digit:]]{3})[-.]([[:digit:]]{4})',
                       '(\1) \2-\3');

=================================================================================

Code Listing 5: Finding the acreage for each park

SQL> COLUMN park_name format a30
SQL> COLUMN acres format a13
SQL> SELECT park_name, SUBSTR(description,
            REGEXP_INSTR(description, '[^ ]+ acres|[^ ]+-acre',1,1,0,'i'),
            REGEXP_INSTR(description, '[^ ]+ acres|[^ ]+-acre',1,1,1,'i')
              - REGEXP_INSTR(description, '[^ ]+ acres|[^ ]+-acre',1,1,0,'i')) acres
     FROM michigan_park
     WHERE REGEXP_LIKE(description, '[^ ]+ acres|[^ ]+-acre','i');

PARK_NAME                       ACRES
____________________________    ___________

Mackinac Island State Park      1800 acres
Muskallonge Lake State Park     217-acre
Porcupine Mountains State Park  60,000 acres
Tahquamenon Falls State Park    40,000+ acres

=================================================================================

Code Listing 6: Using REGEXP_SUBSTR to extract acreage information

SQL> SELECT park_name,
            REGEXP_SUBSTR(description,'[^ ]+[- ]acres?',1,1,'i') acres
     FROM michigan_park
     WHERE REGEXP_LIKE(description, '[^ ]+[- ]acres?','i');

PARK_NAME                      ACRES
____________________________    ___________
Mackinac Island State Park      1800 acres
Muskallonge Lake State Park     217-acre
Porcupine Mountains State Park  60,000 acres
Tahquamenon Falls State Park    40,000+ acres

=================================================================================
test_expressions

create table test_expressions
(char_value varchar2(30), date_value date);

--Table created.

insert into test_expressions
values ('abcd', to_date('27-DEC-09','DD-MON-RR'));

--1 row created.

insert into test_expressions
values ('abb',to_date('27-DEC-09','DD-MON-RR'));

--1 row created.

insert into test_expressions
values ('zzz', to_date('27-DEC-08','DD-MON-RR'));

--1 row created.

insert into test_expressions
values ('zbz', to_date('15-DEC-08','DD-MON-RR'));

--1 row created.

insert into test_expressions
values ('zabz', to_date('15-JUN-09','DD-MON-RR'));

--1 row created.

insert into test_expressions
values ('aaron',to_date('15-JUN-09','DD-MON-RR'));

--1 row created.

commit;

--Commit complete.

'oracle10R2' 카테고리의 다른 글

Benefit ASM  (0) 2011.06.19
oracle 10g partition 적용 가이드  (0) 2011.06.18
Oracle Database 10g:SQL Fundamentals  (0) 2011.06.17
Oreilly - Oracle PL SQL Programming 11gR2 (5th)  (0) 2011.06.09
SQL Tuning 10g 정리  (0) 2011.05.24