2017-10-03 7 views
1

두 개 이상의 문자가 결합 된 구분 기호를 사용하여 문자열을 검색하려고합니다.REGEXP SUBSTR 구분 기호는 2 자 이상의 조합입니다.

쿼리를 찾아주세요 난 다음 시도 :

select REGEXP_SUBSTR('[email protected][email protected]','[^[email protected]]+',1,2) from dual 

필수 출력 :

45$6 

출력 :

45 

내가 쉽게 할 수 이해하여 사용자 정의 된 함수 [INSTR + SUBSTR 함께] 그러나 대답을 & REGEXP_SUBSTR 함께 찾고 있어요.

미리 감사드립니다.

답변

3

그렇게하지 ... 오히려 : 코드의

select REGEXP_SUBSTR('[email protected][email protected]','(.*?)(\[email protected]|$)', 1, 2, null, 1) from dual; 

공지 \$을; $은 문자열의 끝을 의미하므로 리터럴 달러 기호를 의미하는 경우이를 이스케이프해야합니다. 이 솔루션은 "캡처 그룹"개념을 사용합니다. 익숙하지 않은 경우 REGEXP_SUBSTR()에 대한 Oracle 설명서를 참조하십시오. 첫 번째 캡처 그룹은 (.*?) - 구분 기호 앞에 오는 것은 무엇이든지. REGEXP_SUBSTR에 대한 여섯 번째 (마지막) 인수에서 참조됩니다.

공지 사항 또한 내가 두 문자 구분 또는$로 표시되는 문자열 ...의 한쪽 끝을 확인 첫 번째 캡처 그룹 후. 괄호 안의 두 옵션은 | (다른 "특수 문자")로 구분되며 "둘 중 하나의 ... 또는 ..."에 대한 정규 표현식 구문입니다.

+0

정말 고마워요. 내 이해가 정확하다면 조언 해주십시오. '(. *?)': 도트는 모든 문자를 의미하고, *는 0 이상의 문자를 나타냅니다. 그러나 우리가 거기에 남겨두면 탐욕스런 검색이되어 문자열 끝까지 가져옵니다. 따라서 '?'는 검색을 욕심이 없도록하고 구분 기호의 반복을 찾는 첫 번째 지점에서 중지하는 것입니다. 마지막으로 분리 된 값을 얻기 위해 특수 문자를 이스케이프하는 팁과 '또는'문자열 끝을 보내 주셔서 감사합니다. – pOrinG

+0

"욕심 많은"대 "욕심없는"(또는 "게으른") 일치에 대한 이해가 정확합니다. NON-semicolon (또는 모든 단일 문자 구분 기호)의 중단되지 않은 부분 문자열 만 검색하여 사용하고 싶은 트릭을 사용할 수 없기 때문에 ('[^;] +'과 같은) 대신에 반드시 사용해야합니다. *'또는'. +'로 구분 기호를 사용할 때까지는 욕심이없는 검색을 사용해야합니다. '*'보다는'+'의 약점을 주목하라. - 만약 여러분이 서로 바로 옆에 두개의 구분자를 가지고 있다면 그것은 NULL을 표현해야한다; 하지만 + 연산자를 사용하면 완벽하게 놓칠 수 있습니다. * 연산자도 그들을 잡습니다. – mathguy

+0

'+'대'''의 약점이 저를 정말로 놀라게했습니다. 그것 때문에 문제가 발생하지 않는 한 그것에 대해 생각하지 않았을 것입니다. 고맙습니다. – pOrinG