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
更高效,资源消耗更少。