Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用正则表达式(Oracle)从管道分隔字符串获取值_Sql_Regex_Oracle_Regexp Replace_Regexp Substr - Fatal编程技术网

Sql 使用正则表达式(Oracle)从管道分隔字符串获取值

Sql 使用正则表达式(Oracle)从管道分隔字符串获取值,sql,regex,oracle,regexp-replace,regexp-substr,Sql,Regex,Oracle,Regexp Replace,Regexp Substr,我有一个如下所示的示例源字符串,它是管道分隔格式,因为值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 预

我有一个如下所示的示例源字符串,它是管道分隔格式,因为值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中尝试了下面的regexp,但它不能正常工作

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\|([^|]*\|)([^|]*).*$', '\2')) output from t;

当OBR开头时,它工作得很好,但是当OBR在中间,就像上面的样本一样,它工作得不好。


任何帮助都将不胜感激。

不确定Oracle如何处理正则表达式,但以星号开头通常意味着您要查找零个或多个空字符


您是否尝试过
'^.*obr\\\|([^ |]*\\\\\\|)([^ |]*]).$'

这将处理空元素,并包装在一个NVL()调用中,如果找不到“obr”或“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>

regex基本上可以理解为“查找管道的模式,后跟‘obr’,后跟管道,后跟零个或多个非管道字符,后跟管道,后跟零个或多个非管道字符(在捕获的组中记住),后跟管道或行尾”。然后,regexp_substr()调用返回第一个捕获的组,该组是来自“obr”的pipes 2字段之间的字符集。

其工作正常。但它也与这类字符串匹配,但从技术上讲,这不应该发生a | brx | 123 | obriem | 2 | value2 | end |将其添加到您的测试数据中,然后考虑大型机或unix编辑器(例如sed),您是否可能使用了覆盖而不是插入,从而删除了“obr”后面的“\|”搜索?您的字符串是否仍然包含“…obr\ |…”或现在是“…obr([…”?您说过“obr”可以在列表中的任何位置。如果“obr”是列表中倒数第二个或最后一个呢?