我已经审核了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
。我哪里出错?
答案 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,它返回一个与正则表达式匹配的子字符串。