2017-05-02 6 views
-1

아래 쿼리에서 "test0 -test!"하위 문자열을 표시하려고합니다. 문자열이 delimeter "-"로 분리 된 후. 이중 선택에서 regexp_substr ('Helloworld - test0 - test!', '[^ -] +', 1,1)을 선택하십시오."regexp_substr"함수를 사용하여 Oracle에서 마지막 두 값 (Helloworld - test0 - test!) 만 얻는 방법은 무엇입니까?

도와 주시겠습니까?

감사합니다 !!! 원래 패턴이 그랬던 것처럼 (이 대괄호 때문에), 공간의 실행을 취급하고 같은 대시

select regexp_substr('Helloworld - test0 - test!' ,'[^ -]+ - [^ -]+$', 1, 1) 
from dual; 

REGEXP_SUBSTR 
------------- 
test0 - test! 

... :

답변

1

당신은에 패턴을 확장 할 수있다.

select regexp_replace('Helloworld - test0 - test!' ,'(.*)(-)(.*)(-)(.*)$', '\3\4\5') 
from dual; 

REGEXP_REPLAC 
------------- 
test0 - test! 

그러나 당신은 당신이 적어도 두 - 구분이가 아는 한, 정규 표현식이 필요하지 않습니다 : (!이 아마 단순화 할 수있다)

또한 다시 참조와 regexp_replace()을 사용할 수 있습니다 instr()으로 substr()를 사용할 수 있습니다

select substr('Helloworld - test0 - test!', 
    instr('Helloworld - test0 - test!', ' - ', -1, 2) + 3) 
from dual; 

SUBSTR('HELLO 
------------- 
test0 - test! 

instr() 수를 뒤로 문자열의 끝에서 (때문에 세 번째 인수로 -1의) , 두 번째 외모를 찾아서 d 바로 뒤에 놓습니다. 그런 다음 세 개를 추가하여 구분 기호 위로 되돌아 가서 원하는 비트의 시작을 찾으십시오.


당신이 실제로 (당신이 코멘트에 제안() 문제가 말한대로) 항상 마지막 두 개의 토큰을 얻기보다는, 첫 번째 토큰을 건너 뛰고 싶은 경우에, 심지어 쉽게 :

select substr('Helloworld - test0 - test!', 
    instr('Helloworld - test0 - test!', ' - ', 1, 1) + 3) 
from dual; 

SUBSTR('HELLO 
------------- 
test0 - test! 

또는 두 번째 문자열 : 당신이 선호하는 경우가 일반적으로 더 비싼 비록

select substr('welcome - to - stackoverflow - test!', 
    instr('welcome - to - stackoverflow - test', ' - ', 1, 1) + 3) 
from dual; 

SUBSTR('WELCOME-TO-STACKOV 
-------------------------- 
to - stackoverflow - test! 

당신은 여전히, regexp_replace()를 사용할 수 있습니다

당신은 그냥 대시에 분할 할 경우 0
select regexp_replace('Helloworld - test0 - test!', '^[^ -]+ - ', null, 1, 1) 
from dual; 

REGEXP_REPLAC 
------------- 
test0 - test! 

select regexp_replace('welcome - to - stackoverflow - test!', '^[^ -]+ - ', null, 1, 1) 
from dual; 

REGEXP_REPLACE('WELCOME-TO 
-------------------------- 
to - stackoverflow - test! 

하지 공간 대시 공간은, 그 다시 간단합니다. 당신은 또한 트림을 추가해야합니다 뒤에 잎 선행 공백을 제거하려면하지만 없애 :

ltrim(substr(your_string, instr(your_string, '-', 1, 1) + 1)) 

나 :

ltrim(regexp_replace(your_string ,'^[^-]+-', null, 1, 1)) 

또는 제거를의 한 부분으로 패턴 :

regexp_replace(your_string ,'^[^- ]+ ?- ?', null, 1, 1) 

+0

감사 알렉스! 질문이 하나 더 있습니다. 문자열을 분할 한 후 첫 단어를 고려하고 싶지 않습니다. 그래서, 첫 단어를 고려하지 않고 쿼리가 있으면 알려주시겠습니까? – user3282682

+0

죄송합니다, 무슨 뜻인지 모르겠군요. 마지막 두 개의 구분 된 요소가 필요하다고 했잖아요.이 모든 것들이 당신이 원하는 출력물을 만들어내는 것처럼 보입니다. –

+0

필자의 요구 사항은 첫 번째 delimeter "-"뒤에 delimeter "-"가있는 모든 단어를 표시해야합니다. 예를 들어 welcome-to-stackoverflow -test는 항상 welcome이라는 단어를 고려하지 않고 -stackoverflow -test에 동적으로 표시하려고합니다. – user3282682