Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Oracle:从字符串中提取数字_Regex_Oracle - Fatal编程技术网

Regex Oracle:从字符串中提取数字

Regex Oracle:从字符串中提取数字,regex,oracle,Regex,Oracle,我已经复习过了,我想知道我的输出似乎有点偏斜 根据我的理解,REGEXP\u REPLACE方法获取要替换内容的字符串,后跟要匹配的模式,然后任何与该模式不匹配的内容都将替换为替换参数 我编写了以下函数来从文本字段中提取距离,其中将对结果执行空间查询 CREATE OR REPLACE FUNCTION extract_distance ( p_search_string VARCHAR2 ) RETURN VARCHAR2 IS l_distance

我已经复习过了,我想知道我的输出似乎有点偏斜

根据我的理解,
REGEXP\u 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英里
,但事实上我得到
商店在
中销售COD4。我哪里出错了?

“REGEXP\u REPLACE通过允许您在字符串中搜索正则表达式模式来扩展REPLACE函数的功能。默认情况下,该函数返回源字符,其中正则表达式模式的每次出现都替换为REPLACE\u字符串。”

您可以使用,例如,
从DUAL中选择REGEXP_REPLACE('在400英里内销售COD4的商店','^.*(\d+?英里)。*$,'\1',1,0,'i')

或者

从DUAL中选择REGEXP_SUBSTR('400英里内销售COD4的商店','(\d+?英里)',1,1,'i')

您需要使用regexp\u substr,它返回与正则表达式匹配的子字符串


我不知道Oracle,但您的代码似乎正在删除Regex模式(即,将该模式替换为“”)。我认为你需要否定正则表达式,即用空字符串替换不是模式的部分。谢谢Sparky,这些也是我的想法,但是在我引用的问题中,相反的行为得到了证明。也许我应该写一个替代表达式来覆盖字符串的第一部分。@Alex:在这个问题中,正则表达式是否定的<代码>[^0-9]
与数字不匹配,它与非数字的字符匹配。集合开头的
^
使它成为一个负集合。@Guffa啊,这很有趣-正则表达式不是我的最佳领域,因此这将使性能更合理,
SUBSTR
INSTR
方法将比
REGEXP
更高效,资源消耗更少。