Oracle:从String中提取数字

时间:2014-12-06 15:52:10

标签: regex oracle

我已经审核了this question,我想知道我的输出似乎有些偏差。

根据我对REGEXP_REPLACE方法的理解,接受一个要替换内容的字符串,后跟一个匹配的模式,然后用替换参数替换与该模式不匹配的任何内容。

我已经编写了以下函数来从文本字段中提取距离,其中将对结果执行空间查询。

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;

当我在一个区块中运行它来测试时:

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。我哪里出错?

2 个答案:

答案 0 :(得分:2)

“REGEXP_REPLACE通过让您在字符串中搜索正则表达式模式来扩展REPLACE函数的功能。默认情况下,该函数返回source_char,每次出现的正则表达式模式都替换为replace_string。”来自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;

答案 1 :(得分:0)

你想要使用regexp_substr,它返回一个与正则表达式匹配的子字符串。

REGEX_SUBSTR