【发布时间】:2014-12-07 00:13:05
【问题描述】:
我查看了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。我哪里出错了?
【问题讨论】:
-
我不了解 Oracle,但您的代码似乎正在删除正则表达式模式(即用 '' 替换模式)。我认为你需要否定正则表达式,即用空字符串替换不是模式的部分
-
谢谢 Sparky,这也是我的想法,但是在我提到的问题中,我提到了相反的行为。也许我应该写一个替换表达式来覆盖字符串的第一部分。
-
@Alex:在那个问题中,正则表达式 is 被否定。
[^0-9]不匹配数字,它匹配不是数字的字符。集合开头的^使其成为负集合。 -
@Guffa 啊,这很有趣 - 正则表达式不是我最擅长的领域,所以这是有道理的
-
性能方面,
SUBSTR和INSTR方法将比REGEXP更高效且资源消耗更少。