【问题标题】:Oracle regexp_substr - extract substring from string comes in different formatsOracle regexp_substr - 从字符串中提取子字符串有不同的格式
【发布时间】:2018-01-03 18:25:19
【问题描述】:

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

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;

【问题讨论】:

  • 空字符串还是NULL好吗?
  • 两者都适合我
  • @WiktorStribiżew 这是 Oracle,所以空字符串为空。
  • @WilliamRobertson 实际上,我已经看到一些问题,其中 OP 专门询问“空字符串”。所以,我只想说清楚,以避免任何进一步的术语和其他“争议”。
  • @WiktorStribiżew - 啊,我明白你的意思了 :)

标签: sql regex database oracle


【解决方案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

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

【讨论】:

  • IP 结尾不带 ' 时不起作用; ' , 试试第二个字符串
  • @BilalHalayqa 那是因为 your 模式没有考虑到这一点。最后去掉;,就可以了。
猜你喜欢
  • 2012-06-26
  • 2014-08-18
  • 2019-07-23
  • 2021-12-18
  • 2019-10-26
  • 2022-01-19
  • 2021-10-11
  • 2021-01-29
  • 2019-02-20
相关资源
最近更新 更多