오라클 정규표현식 질문 0 2 713

by 디린이 오라클 정규표현식 [2021.07.09 22:19:39]


SELECT     REGEXP_SUBSTR ('testtesttest','(.*)\1') AS TEST
FROM  DUAL;

위를 출력할 때 값이

testtest 가 출력되는 이유가 무엇인가요 ?

제가 알기로는 \1은 앞의 서브표현식인 (.*)을 그대로 쓰는거라고 생각해서

SELECT     REGEXP_SUBSTR ('testtesttest','(.*)(.*)') AS TEST
FROM  DUAL;

와 동일하다고 생각했는데, 위 쿼리문 결과 값은

testtesttest 가 출력이 됩니다.

혹시 이유를 알 수 있을까요 ?

 

SELECT    REGEXP_SUBSTR ('abxab' , '(ab|cd)x\1') AS C1
  FROM  DUAL;

위 쿼리는 제 생각대로

SELECT    REGEXP_SUBSTR ('abxab' , '(ab|cd)x(ab|cd)') AS C1
  FROM  DUAL;

로 변환해서 쿼리문을 실행하면 

결과가 abxab 로 동일한 결과값이 나옵니다.

그런데 (.*) 표현식만 저런식으로 제가 생각한 방식과 다르게 나옵니다 .

정말 이것저것 검색해봤는데 의문이 풀리지 않아 질문합니다 ..

by 뉴비디비 [2021.07.10 22:02:00]

표현식 패턴이 달라서 다른 결과가 나오는게 맞는거 같아요. 

SELECT 1
    ,REGEXP_SUBSTR ('testtesttest','(.*)test\1') AS TEST1
    ,REGEXP_SUBSTR ('testtesttest','(.*)test(.*)') AS TEST2
    ,REGEXP_SUBSTR ('testtesttest','(test|aaa)test\1') AS TEST3
    ,REGEXP_SUBSTR ('testtesttest','(test|aaa)test(test|aaa)') AS TEST4
    ,REGEXP_SUBSTR ('abxab' , '(ab|cd)x\1') AS C1
    ,REGEXP_SUBSTR ('abxab' , '(ab|cd)x(ab|cd)') AS C2
FROM  DUAL;

 


by 마농 [2021.07.12 08:06:19]

.* 는 abc 도 될 수 있고, xyz 도 될 수 있습니다. 뭐든 될 수 있습니다.
\1 은 뭐든 될 수 있는게 아니라 앞에 나욌던 것만 될 수 있습니다.
표현식의 의미와 그 결과에 대해 구별하셔야 합니다.
\1 은 앞에 나왔던 표현식 자체을 의미하는게 아니라
\1 은 앞에 나왔던 표현식의 결과값을 의미하는 것입니다.
표현식 자체가 다양한 값을 아우르고 있다면?
같은 표현식을 반복적으로 쓴다고 해서 값은 값이 반복되는게 아닙니다.

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