oracle正则表达式子字符串问题



我正在努力想出一个正则表达式,它可以提取模式介于"abc_"one_answers"&"之间的所有内容

Example 1: 
Input string: abc_s=facebook&abc_m=social&abc_c=abcd-video&clicks=jfhjkfdjfdjkfh
Output string: abc_s=facebook&abc_m=social&abc_c=abcd-video
Example 2: 
input string: abc_s=facebook&abc_m=social&gmpc_c=abcd-ideo&clicks=jfhjkfdjfdjkfh
output string: abc_s=facebook&abc_m=social&

关于如何实现这一点的任何想法。。。我查看了文档,但对于如何使用regexpsubstr函数来实现这一点,我不是很清楚。

您可以使用instrsubstr的组合来实现它,如下所示:

SELECT SUBSTR(INPUT_STR,
1, INSTR(SUBSTR(INPUT_STR, (INSTR(INPUT_STR, 'abc_', -1) + 4)), '&')) AS OUTPUT_STR
FROM YOUR_TABLE

试试看,让我知道它对你有用吗?

干杯!!

听起来像是在尝试从"第一个abc_'"到"第一个不跟在abc_'后面的'&'"的子字符串。对于开始部分,常规的INSTR将起作用;对于结束条件,您需要一个regexp。

set scan off
-- example data
with x as (select 'abc_s=facebook&abc_m=social&abc_c=abcd-video&clicks=jfhjkfdjfdjkfh' as s from dual
union select 'abc_s=facebook&abc_m=social&gmpc_c=abcd-ideo&clicks=jfhjkfdjfdjkfh' from dual
union select 'www.google.com/search?abc_source=blah&abc_medium=blahblah&abc_campaign=blahblah' from dual)
-- query
SELECT SUBSTR(s,
INSTR(s, 'abc_'), -- start with the first 'abc_'
regexp_instr(s, '(&[^a][^b][^c][^_])|$')-1 -- end with the first & that isn't followed by "abc_"; or the end
) AS OUTPUT_STR
FROM x;

输出:

abc_s=facebook&abc_m=social&abc_c=abcd-video                      
abc_s=facebook&abc_m=social
abc_source=blah&abc_medium=blahblah&abc_campaign=blahblah

顺便说一句,如果你试图拆分"&"-将逗号分隔的值放入列表中,尝试查看有关拆分逗号分隔值的问题之一,但使用&而不是逗号。

最新更新