오라클 정규식에서 특정 단어 제외 패턴 1 3 5,191

by jkson [2019.06.28 10:44:54]


예전에 제가 구루비에 질문을 한번 올렸던 기억이 있는데..

정규식에서 특정 단어를 제외하는 패턴은 어떻게 가능할지..

명확한 답을 찾지 못 했었던 기억이 있는데요.

오늘 가끔 들르는 카페에 비슷한 질의가 있어서 생각해보니

좀 무식한 방법이긴 합니다만 아래와 같은 방법도 가능하겠더라구요.

질의는

특정 문자열에서 ABC~ZZZ가 처음으로 발견되는 패턴만 삭제하는 것이었습니다.

WITH T AS
(
SELECT 'ABC AAA BBB ZZZ UUUUU ABC DDD ZZZ YYYY' TXT FROM DUAL UNION ALL
SELECT 'ABC AAA BBB ZZZZ UUUUU ABC DDD ZZZ YYYY' TXT FROM DUAL UNION ALL
SELECT 'ABC AAA BBB ZZZZ UUUUU ABC DDD YYYY' TXT FROM DUAL UNION ALL
SELECT 'AB AAA BBB ZZZZ UUUUU ABC DDD YYYY' TXT FROM DUAL
)
SELECT REGEXP_REPLACE(TXT,'ABC([^Z]|Z[^Z]|ZZ[^Z])*ZZZ[^Z]','',1,1) FROM T

 

제가 생각한 내용은 ABC로 시작하고 ZZZ가 아닌 글자가 반복되다가 ZZZ로 끝나는 패턴이어서 위와 같이 한번 해보았습니다.

[^ABC] 구문은 ABC 단어 제외가 아니라 A나 B나 C를 제외하는 구문이기 때문에

단어 제외의 경우 좀 복잡하지만 위와 같이 사용하는 것도 괜찮을 것 같아요.

혹시 더 좋은 방법이 있다면 공유 부탁드려요^^;

by 마농 [2019.06.28 11:05:57]

문제의 요구사항이 명확한가? 고민해 볼 필요가 있겠네요.
ABC로 시작하고 ZZZ가 아닌 글자가 반복되다가 ZZZ로 끝나는 패턴에서
 공백을 기준으로 단어를 분할해서 확인해야 하는 것이 맞는지?
아니면 공백을 무시하고 확인해야 하는 것인지?
예) XXABCDE 문자열을 ABC 로 시작한다고 볼 수 있는가? 아닌가?
예) XXZZZZZ 문자열을 ZZZ 으로 끝난다고 볼 수 있는가? 아닌가?


by jkson [2019.06.28 15:15:32]

쿼리만들면서 공백은 생각 안 했네요ㅋㅋ

정규식에서 특정 단어를 제외할 때 어떻게 할 것인가.. 에 대한 글이라 생각해주세요^^;

공백 고려..

SELECT TRIM(REGEXP_REPLACE(TXT,'(\sABC|^ABC)\s([^Z]|Z[^Z]|ZZ[^Z])*\s(ZZZ |ZZZ$)',' ',1,1)) FROM T


by 문어찐빵 [2019.08.31 14:40:51]

감사합니다! 이러한 방법도 있네요ㅎㅎ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입