Oracle regexp_substr - 从字符串中提取子字符串有不同的格式

时间:2018-01-03 09:57:13

标签: sql regex database oracle

我有一个字符串,它有不同的格式,如下所示:

UserId=1;IP Address=85.154.221.54;Device Type=Chrome57
Device Type=Chrome57;IP Address=85.154.221.54
Device Type=Chrome57

如果没有匹配,如何提取IP地址并返回空字符串?

我已尝试过以下操作,但如果没有匹配则返回字符串。

select regexp_replace('Error=0;UserId=-1;IP Address=85.154.221.54;Device Type=Chrome57', '.*IP Address=(.+);.*', '\1') from dual;

1 个答案:

答案 0 :(得分:1)

您可以使用REGEXP_SUBSTR略微改进的模式:

select regexp_substr('Error=0;UserId=-1;IP Address=85.154.221.54;Device Type=Chrome57',
                     'IP Address=([0-9.]+)',
                     1, 1, NULL, 1
                    )
from dual

在这里,

  • IP Address= - 匹配IP Address=
  • ([0-9.]+) - 在第1组中匹配并捕获一个或多个数字或/和.

查看online demo。如果没有匹配,则输出将 NULL

select regexp_substr('Error=0;UserId=-1;IP Address=85.154.221.54;Device Type=Chrome57',
                     'IP Address=([0-9.]+)',
                     1, 1, NULL, 1
                    ) as Result
from dual
-- => 85.154.221.54
--select regexp_substr('Error=0;UserId=-1;IP Address= Device Type=Chrome57', 'IP Address=([0-9.]+)', 1, 1, NULL, 1) as result from dual
-- => NULL

enter image description here

请注意,1函数的最后一个REGEXP_SUBSTR参数返回捕获组#1的内容(使用模式的第一个带括号的部分捕获的文本)。