使用 Regex (Oracle) 从竖线分隔的字符串中获取值
Fetching value from Pipe-delimited String using Regex (Oracle)
我有一个示例源字符串,如下所示,它采用竖线分隔格式,因为值 obr 可以位于任何位置。我需要从 obr 的第一次出现处获取管道的第二个值。所以对于下面的源字符串,预期的是,
源字符串:
select 'asd|dfg|obr|1|value1|end' text from dual
union all
select 'a|brx|123|obr|2|value2|end' from dual
union all
select 'hfv|obr|3|value3|345|pre|end' from dual
预期输出:
value1
value2
value3
我已经在 oracle sql 中尝试了以下正则表达式,但它无法正常工作。
with t as (
select 'asd|dfg|obr|1|value1|end' text from dual
union all
select 'a|brx|123|obr|2|value2|end' from dual
union all
select 'hfv|obr|3|value3|345|pre|end' from dual
)
select text,to_char(regexp_replace(text,'*obr\|([^|]*\|)([^|]*).*$', '')) output from t;
当字符串以 OBR 开头时它工作正常,但是当 OBR 像上面的示例一样位于中间时它工作不正常。
如有任何帮助,我们将不胜感激。
不确定 Oracle 如何处理正则表达式,但以星号开头通常意味着您要查找零个或多个空字符。
你试过了吗'^.*obr\|([^|]*\|)([^|]*).*$'
?
这处理 null 元素并包装在 NVL() 调用中,如果 'obr' 未找到或出现在距离记录末尾太远的位置,则该调用提供一个值,因此不可能有值 2:
SQL> with t(id, text) as (
select 1, 'asd|dfg|obr|1|value1|end' from dual
union
select 2, 'a|brx|123|obr|2|value2|end' from dual
union
select 3, 'hfv|obr|3|value3|345|pre|end' from dual
union
select 4, 'hfv|obr||value4|345|pre|end' from dual
union
select 5, 'a|brx|123|obriem|2|value5|end' from dual
union
select 6, 'a|brx|123|obriem|2|value6|obr' from dual
)
select
id,
nvl(regexp_substr(text, '\|obr\|[^|]*\|([^|]*)(\||$)', 1, 1, null, 1), 'value not found') value
from t;
ID VALUE
---------- -----------------------------
1 value1
2 value2
3 value3
4 value4
5 value not found
6 value not found
6 rows selected.
SQL>
正则表达式基本上可以读作"look for a pattern of a pipe, followed by 'obr', followed by a pipe, followed by zero or more characters that are not a pipe, followed by a pipe, followed by zero or more characters that are not a pipe (remembered in a captured group), followed by a pipe or the end of the line"。 regexp_substr() 然后调用 returns 第一个捕获组,它是 'obr'.
中管道 2 字段之间的字符集
我有一个示例源字符串,如下所示,它采用竖线分隔格式,因为值 obr 可以位于任何位置。我需要从 obr 的第一次出现处获取管道的第二个值。所以对于下面的源字符串,预期的是,
源字符串:
select 'asd|dfg|obr|1|value1|end' text from dual
union all
select 'a|brx|123|obr|2|value2|end' from dual
union all
select 'hfv|obr|3|value3|345|pre|end' from dual
预期输出:
value1
value2
value3
我已经在 oracle sql 中尝试了以下正则表达式,但它无法正常工作。
with t as (
select 'asd|dfg|obr|1|value1|end' text from dual
union all
select 'a|brx|123|obr|2|value2|end' from dual
union all
select 'hfv|obr|3|value3|345|pre|end' from dual
)
select text,to_char(regexp_replace(text,'*obr\|([^|]*\|)([^|]*).*$', '')) output from t;
当字符串以 OBR 开头时它工作正常,但是当 OBR 像上面的示例一样位于中间时它工作不正常。
如有任何帮助,我们将不胜感激。
不确定 Oracle 如何处理正则表达式,但以星号开头通常意味着您要查找零个或多个空字符。
你试过了吗'^.*obr\|([^|]*\|)([^|]*).*$'
?
这处理 null 元素并包装在 NVL() 调用中,如果 'obr' 未找到或出现在距离记录末尾太远的位置,则该调用提供一个值,因此不可能有值 2:
SQL> with t(id, text) as (
select 1, 'asd|dfg|obr|1|value1|end' from dual
union
select 2, 'a|brx|123|obr|2|value2|end' from dual
union
select 3, 'hfv|obr|3|value3|345|pre|end' from dual
union
select 4, 'hfv|obr||value4|345|pre|end' from dual
union
select 5, 'a|brx|123|obriem|2|value5|end' from dual
union
select 6, 'a|brx|123|obriem|2|value6|obr' from dual
)
select
id,
nvl(regexp_substr(text, '\|obr\|[^|]*\|([^|]*)(\||$)', 1, 1, null, 1), 'value not found') value
from t;
ID VALUE
---------- -----------------------------
1 value1
2 value2
3 value3
4 value4
5 value not found
6 value not found
6 rows selected.
SQL>
正则表达式基本上可以读作"look for a pattern of a pipe, followed by 'obr', followed by a pipe, followed by zero or more characters that are not a pipe, followed by a pipe, followed by zero or more characters that are not a pipe (remembered in a captured group), followed by a pipe or the end of the line"。 regexp_substr() 然后调用 returns 第一个捕获组,它是 'obr'.
中管道 2 字段之间的字符集