在 oracle sql 中使用正则表达式从逗号分隔的字符串中提取数字

Extract a number from comma separated string using regular expressions in oracle sql

我正在尝试获取以逗号分隔的字符串中以 628 开头的数字。 以下是我正在使用的:

SELECT 
    REGEXP_REPLACE(REGEXP_SUBSTR('62810,5152,,', ',?628[[:alnum:]]+,?'),',','') first,
    REGEXP_REPLACE(REGEXP_SUBSTR('5152,62810,,', ',?628[[:alnum:]]+,?'),',','') second,
    REGEXP_REPLACE(REGEXP_SUBSTR('5152,562810,,', ',?628[[:alnum:]]+,?'),',','') third,
    REGEXP_REPLACE(REGEXP_SUBSTR(',5152,,62810', ',?(628[[:alnum:]]+),?'),',','') fourth
FROM DUAL;

它可以工作,但在一种情况下它失败了,即第三列,其中数字为 562810。实际上我希望第三列为 NULL。

上述查询的实际输出是:

"FIRST","SECOND","THIRD","FOURTH"
"62810","62810","62810","62810"

您的正则表达式逻辑存在问题,您正在搜索数字 628 前的 可选 逗号。这意味着任何具有 628 的数字都会匹配。相反,您可以通过查找 628 来表达这一点,628 前面有逗号, 字符串的开头。

SELECT
    REGEXP_REPLACE(REGEXP_SUBSTR('62810,5152,,', '(,|^)628[[:alnum:]]+,?'),',','') first,
    REGEXP_REPLACE(REGEXP_SUBSTR('5152,62810,,', '(,|^)628[[:alnum:]]+,?'),',','') second,
    REGEXP_REPLACE(REGEXP_SUBSTR('5152,562810,,', '(,|^)628[[:alnum:]]+,?'),',','') third,
    REGEXP_REPLACE(REGEXP_SUBSTR(',5152,,62810', '(,|^)(628[[:alnum:]]+),?'),',','') fourth
FROM DUAL

Demo

我们想在这里使用的理想模式是 \b628.*,或者类似的东西。但是 Oracle 的正则表达式函数似乎不支持单词边界,因此我们可以使用 (^|,)628.* 作为替代。

不确定您为什么要使用 [[:alnum::]]。您可以使用匹配组来提取以 628 开头或后跟逗号的数字。 REPLACE这样可以避免

如果您也有字母表,请相应地修改第二个匹配组 ()

SELECT 
    REGEXP_SUBSTR('62810,5152,,' , '(^|,)(628\d*)',1,1,NULL,2) first,
    REGEXP_SUBSTR('5152,62810,,' , '(^|,)(628\d*)',1,1,NULL,2) second,
    REGEXP_SUBSTR('5152,562810,,', '(^|,)(628\d*)',1,1,NULL,2) third,
    REGEXP_SUBSTR(',5152,,62810' , '(^|,)(628\d*)',1,1,NULL,2) fourth
FROM DUAL;

Demo