вопрос о подстроке регулярного выражения оракула

Я изо всех сил пытаюсь придумать регулярное выражение, которое извлекает все с шаблоном между "abc_" и "&"

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&

любые идеи о том, как этого добиться... я просмотрел документацию, но мне не очень ясно, как использовать функцию regexp_substr для достижения этой цели.


person user1751356    schedule 25.10.2019    source источник


Ответы (2)


Вы можете добиться этого, используя комбинацию instr и substr следующим образом:

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

Попробуйте и дайте мне знать, если это работает для вас?

Ваше здоровье!!

person Popeye    schedule 25.10.2019
comment
в основном я хочу извлечь всю строку с шаблоном abc_ до последнего & (исключить последний &), если abc_& повторяется 2 раза, то я хочу извлечь ту часть, которая abc_w=123&abc_x=256 и если abc_& повторяется 4 раза я хочу извлечь все abc_w=123&abc_x=123&abc_y=123&abc_z=123, и строка может содержать любые другие дополнительные значения, которые просто нужно отбросить. Ваше решение не работает :( - person user1751356; 25.10.2019

Похоже, вы пытаетесь сделать подстроку от «первого 'abc_'» до «первого '&', за которым не следует 'abc_'». Для начальной части подойдет обычный INSTR; для конечного условия вам понадобится регулярное выражение.

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

В качестве примечания: если вы пытаетесь разделить значения, разделенные символом &, в список, попробуйте просмотреть один из вопросов о разделении значений, разделенных запятыми, но используйте & вместо запятой.

person kfinity    schedule 25.10.2019
comment
я хочу точно указать всю строку с шаблоном abc_ и разделителем &. Я попробовал ваше решение, и оно не дало желаемых результатов. - person user1751356; 25.10.2019
comment
Может быть, вы могли бы отредактировать свой вопрос, чтобы показать желаемые результаты? - person kfinity; 25.10.2019
comment
в основном я хочу извлечь всю строку с шаблоном abc_ до последнего & (исключить последний &), если abc_& повторяется 2 раза, то я хочу извлечь ту часть, которая abc_w=123&abc_x=256 и если abc_& повторяется 4 раза я хочу извлечь все abc_w=123&abc_x=123&abc_y=123&abc_z=123, и строка может содержать любые другие дополнительные значения, которые просто нужно отбросить. - person user1751356; 25.10.2019
comment
Можете ли вы привести пример строки, в которой мой запрос не делает то, что вы хотите? - person kfinity; 25.10.2019
comment
не могли бы вы попробовать этот URL - person user1751356; 25.10.2019
comment
входная строка: www.google.com/search?abc_source=blah&abc_medium=blahblah&abc_campaign=blahblah ожидаемая выходная строка: abc_source=blah&abc_medium=blahblah&abc_campaign=blahblah - person user1751356; 25.10.2019
comment
на самом деле последнее слово может содержать или не содержать &, так как это конец строки. Плохо, что я не указал это четко. - person user1751356; 25.10.2019
comment
О Конечно! Я обновил регулярное выражение, чтобы искать либо &nonabcstring, либо конец строки. - person kfinity; 28.10.2019