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

标签 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;

最佳答案

您可以将 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

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

关于sql - Oracle regexp_substr - 从不同格式的字符串中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48075021/

相关文章:

sql - 窗口函数,尝试按 created_at 从连接表中的列排序而不分组

sql - 如何使用数据透视表进行分组

regex - 如何使用ultraedit和正则表达式删除 "(2003)"等字符串中的括号?

java - 正则表达式 VS 包含。最棒的表演?

MySQL 100% CPU 每 12-18 小时

mysql - 遍历mysql中的select语句

php - PHP 中的 MYSQL UPDATE 和 SET 语句(500 错误响应)

java - 对于所有相同的号码,电话号码验证应该失败

c# - MongoDB C# 身份验证异常

database - 具有不等条件的合并连接算法