2014-12-06 12 views
0

나는 this question을 검토했으며 출력 결과가 약간 왜곡 된 것 같습니다.오라클 : 문자열에서 숫자 추출

내 이해에 따라 REGEXP_REPLACE 메서드는 내용을 바꾼 문자열과 일치하는 패턴을 취한 다음 해당 패턴과 일치하지 않는 것이 대체 매개 변수로 바뀝니다.

필자는 텍스트 필드에서 거리를 추출하기 위해 다음과 같은 함수를 작성했으며 결과에 공간 쿼리가 수행됩니다.

DECLARE 
    l_output VARCHAR2(25); 
BEGIN 
    l_output := extract_distance('Stores selling COD4 in 400 Miles'); 
    DBMS_OUTPUT.PUT_LINE(l_output);  
END; 

내가 출력 400 miles을 기대하지만,에 - 사실 나는 Stores selling COD4 in를 얻을 :

CREATE OR REPLACE FUNCTION extract_distance 
(
    p_search_string VARCHAR2 
) 
    RETURN VARCHAR2 
IS 
    l_distance  VARCHAR2(25); 
BEGIN 

    SELECT REGEXP_REPLACE(UPPER(p_search_string), '(([0-9]{0,4}) ?MILES)', '') 
    INTO l_distance FROM SYS.DUAL; 

    RETURN l_distance; 
END extract_distance; 

나는 시험 블록이 실행합니다. 내가 어디로 잘못 갔니?

+0

나는 오라클 모르겠지만, 코드가 (즉, ''패턴과 교체) 정규식 패턴을 제거하는 것 같습니다. Regex를 무효로 할 필요가 있다고 생각합니다. 패턴이 아닌 부분을 빈 문자열로 바꿔야합니다. – Sparky

+0

감사합니다. Sparky, 그 역시 제 생각 이었지만, 반대의 행동을 언급 한 질문에서 설명했습니다. 어쩌면 문자열의 첫 번째 부분을 재정의하기 위해 하위 표현식을 작성해야합니다. – Alex

+0

@Alex : 그 질문에 정규 표현식 *은 무효화됩니다. '[^ 0-9]'는 숫자와 일치하지 않으며, 숫자가 아닌 문자와 일치합니다. 집합의 시작 부분에있는 '^'는 음의 집합을 만듭니다. – Guffa

답변

2

"REGEXP_REPLACE는 문자열에서 정규 표현식 패턴을 검색하도록하여 REPLACE 함수의 기능을 확장합니다. 기본적으로이 함수는 replace_string으로 바뀌는 정규 표현식 패턴이 나타날 때마다 source_char을 반환합니다." Oracle docu

당신이 사용할 수있는, 예를 들어,
SELECT REGEXP_REPLACE('Stores selling COD4 in 400 Miles', '^.*?(\d+ ?MILES).*$', '\1', 1, 0, 'i') FROM DUAL;

또는 대안
SELECT REGEXP_SUBSTR('Stores selling COD4 in 400 Miles', '(\d+ ?MILES)', 1, 1, 'i') FROM DUAL;

+0

그 것이 매력적이었습니다. 감사합니다. @Abecee – Alex

0

에서 당신이 사용하는 정규 표현식과 일치하는 문자열을 반환 REGEXP_SUBSTR을 할 것입니다.

REGEX_SUBSTR