我正在努力想出一个正则表达式,它可以提取模式介于"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函数来实现这一点,我不是很清楚。
您可以使用instr
和substr
的组合来实现它,如下所示:
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
顺便说一句,如果你试图拆分"&"-将逗号分隔的值放入列表中,尝试查看有关拆分逗号分隔值的问题之一,但使用&而不是逗号。