Oracle regular expression split string from last occurence(Oracle 正则表达式从上次出现拆分字符串)
问题描述
我还在学习oracle中的正则表达式我卡在中间,下面是我的示例代码:
I am still learning regexp in oracle I am stuck in middle, below is my sample code:
with t(val)
as
(
--format: xyz_year_month_date
select 'my_new_table_2015_06_31' from dual
union all
select 'my_new_table_temp_2016_06_31' from dual
)
select reverse(regexp_substr(reverse(val),'[^_]+',1,4)) col4,
reverse(regexp_substr(reverse(val),'[^_]+',1,3)) col3,
reverse(regexp_substr(reverse(val),'[^_]+',1,2)) col2,
reverse(regexp_substr(reverse(val),'[^_]+',1,1)) col1
from t;
Output:
COL4 COL3 COL2 COL1
table 2015 06 31
temp 2016 06 31
Expected output:
COL4 COL3 COL2 COL1
my_new_table 2015 06 31
my_new_table_temp 2016 06 31
提前致谢.
推荐答案
你可以通过提取不同的捕获组(用圆括号 ()
括起来)来做到这一点:
You can do it without the double reverse by extracting different capture groups (surrounded in round ()
brackets):
WITH t ( VAL ) AS (
SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 1 ) AS COL4,
REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 2 ) AS COL3,
REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 3 ) AS COL2,
REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 4 ) AS COL1
FROM t
您甚至可以通过使用以下命令来使正则表达式更简单:
You could even make the regular expression much simpler by just using:
'^(.+)_(.+)_(.+)_(.+)$'
第一个 .+
是贪婪的,所以它会尽可能多地匹配,直到只剩下足够的字符串用于第 2 到第 4 个捕获组的最小匹配.
The first .+
is greedy so it will match as much as possible until there is only enough of the string left for the minimum matches on the 2nd - 4th capturing groups.
但是,您不需要正则表达式:
WITH t ( VAL ) AS (
SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT SUBSTR( val, 1, pos1 - 1 ) AS col4,
SUBSTR( val, pos1 + 1, pos2 - pos1 - 1 ) AS col3,
SUBSTR( val, pos2 + 1, pos3 - pos2 - 1 ) AS col2,
SUBSTR( val, pos3 + 1 ) AS col1
FROM (
SELECT val,
INSTR( val, '_', -1, 1 ) AS pos3,
INSTR( val, '_', -1, 2 ) AS pos2,
INSTR( val, '_', -1, 3 ) AS pos1
FROM t
);
这篇关于Oracle 正则表达式从上次出现拆分字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Oracle 正则表达式从上次出现拆分字符串


基础教程推荐
- SQL Server:只有 GROUP BY 中的最后一个条目 2021-01-01
- 使用pyodbc“不安全"的Python多处理和数据库访问? 2022-01-01
- 无法在 ubuntu 中启动 mysql 服务器 2021-01-01
- ERROR 2006 (HY000): MySQL 服务器已经消失 2021-01-01
- 将数据从 MS SQL 迁移到 PostgreSQL? 2022-01-01
- Sql Server 字符串到日期的转换 2021-01-01
- 如何在 SQL Server 的嵌套过程中处理事务? 2021-01-01
- SQL Server 中单行 MERGE/upsert 的语法 2021-01-01
- SQL Server 2016更改对象所有者 2022-01-01
- 在 VB.NET 中更新 SQL Server DateTime 列 2021-01-01