【问题标题】:Oracle: Extract number from StringOracle:从字符串中提取数字
【发布时间】: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 啊,这很有趣 - 正则表达式不是我最擅长的领域,所以这是有道理的
  • 性能方面,SUBSTRINSTR 方法将比 REGEXP 更高效且资源消耗更少。

标签: regex oracle


【解决方案1】:

“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;

【讨论】:

    【解决方案2】:

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

    REGEX_SUBSTR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2015-12-27
      • 2021-01-29
      • 2019-02-20
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多