오라클 정규식 연산자에 대해 질문드립니다. 0 6 5,346

by 손님 정규식 [2012.07.20 16:09:14]


대문자 소문자 숫자 특수문자가 혼합된 8자 이상의 문자를 찾아오려고 합니다.(패스워드 패턴입니다)

인터넷을 뒤지고 공부하고 참고해서 

((?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[[:punct:]]).{8,})

위와 같은 정규식 구문이 만들어 졌습니다.

약간의 문제가 있지만  아래와 같은 패턴에 대해 모두 만족하는 정규식이 만들어졌지요.

Abcdef1234!
1qA!jijiji test 
1qaz!QAZ abc
Abcde1345
1qA!QAZ
!QAZ1qaz
zaq1ZAQ!
 
 
그런데 이걸 오라클 정규식에 대입하려고 하니
 
?=   <-- 이구문이 작동이 안되는것 같더군요. 에러는 나지 않습니다.
 
오라클 정규식 항목을 찾아보니 정규식 연산자에는 ?=  부분이 없는것 같습니다.
 
이런저런 시도를 해보고 있습니다만 능력 부족으로 잘 되지 않는 군요.
 
단순히 (?[a-z])(?[A-Z])(?[0-9])
 
이런식으로 넣으면
 
aA0 (O)
A0a (X)
Aa0 (X)
 
이런식으로 순서가 맞는 경우에만 매칭이 되지
포함이 되는지 아닌지에 대해서는 체크가 되지 않습니다.
 
도움 부탁드립니다
by 마농 [2012.07.20 16:47:03]
-- 굳이 하나의 복잡한 조건을 만들 필요가 있나요?
-- 5가지 단순 조건을 따로 체크해서 AND 조건으로 풀면 되지요...
SELECT pw
  FROM t
 WHERE REGEXP_LIKE(pw, '[a-z]') -- 소문자 포함 여부
   AND REGEXP_LIKE(pw, '[A-Z]') -- 대문자 포함 여부
   AND REGEXP_LIKE(pw, '[0-9]') -- 숫자 포함 여부
   AND REGEXP_LIKE(pw, '[[:punct:]]') -- 특수문자 포함 여부
   AND LENGTH(pw) >= 8 -- 8자리 이상
;

by 손님 [2012.07.20 18:07:00]
답변 감사드립니다. 마농님은 한 7~8년전에도 dbsarangnet에서도 뵌거 같은데 아직도 열심이시네요^^;

일단 제 질문이 약간 미흡했던것 같네요.

select regexp_replace(col1,정규식,'****')
  from tabs;

위와 같은 구문으로 해서 
패스워드에 해당하는 값만 masking 하여  ****로 나오게 하려고 했던거구요.

답변을 보니 굳었던 머리가 풀리는것 같네요.
저렇게 해도 되겠네요 굳이 replace를 저런식으로 할 필요는 없으니까요.

다시 한번 감사드립니다.

by 손님 [2012.07.20 18:17:48]
아 하나만 더 물어봐도 될까요. 
보통 PL/SQL에서 에러 처리를 할때

SQLCODE와 SQLERRM 를 EXCEPTION을 통해
에러 테이블에 인서트를 하는데
이 에러를 발생시킨 SQL을 바로 알아내는 방법이 있나요?

저는 SQL을 별도의 변수에 저장시킨후 에러 테이블에 저장시킬때
같이 저장시키는 방법을 쓰고 있습니다만 여러모로 불편해서요

by 부쉬맨 [2012.07.20 20:04:54]
도움이되실지는모르겠지만

저는 노가다이긴하지만

해당 sql 을 plsql에서 실행할때마다
해당 sql의 번호를 주어서
error 발생시에 해당 sql번호를 담아서 보여줘서 어떠한 sql로인하여 plsql이 에러가 발생했는지를
확인하는 방식을 사용을 했네요.

by 부쉬맨 [2012.07.20 20:06:14]
방법은

location := '1'
 sql
location := '2'
 sql

exception
err := location 

간단히는 이런식으로도 사용을했네요

by 손님 [2012.07.24 20:16:13]
답변 감사드립니다. 결국 사용자가 저장하는 수밖에 없겠네요 ^^;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입