红移提取两个模式之间的字符串 (regexp_substr)



我正在尝试提取deviceSerialNumber=之后的文本,直到&或字符串的末尾。数据看起来像

someddata&=somedataAgain&device序列号=device12345&otherField=moreData someddata&=somedataAgain&deviceSerialNumber=deviceabcd

我试过这个

REGEXP_SUBSTR(session_tags || '&', 'deviceSerialNumber(.*)&') from table

但是,这将返回所有文本,直到最后一&(这是字符串的末尾,因为我出于模式匹配目的附加了一个&(。我如何修改此正则表达式以仅提取文本直到第一个&

我知道现在回复晚了,但这是对我有用的解决方案。

select regexp_substr(
'someddata&=somedataagain&deviceSerialNumber=device12345&anotherField=moreData ', 
'deviceSerialNumber=(.*)&', 0, 1, 'e');

使用出现参数

REGEXP_SUBSTR(session_tags, 'deviceSerialNumber=(.+?)&',1,1) from table

REGEXP_SUBSTR(session_tags,(?<=deviceSerialNumber=)(.*?)(?=&)) from table

.*将匹配到最后一个 &.*?将匹配到第一个 &

我遇到了与regexp_substr相同的Invalid preceding regular expression prior to repetition operator

我最终确定的解决方法是两个嵌套split_part

select
params, 
split_part(split_part(params, 'deviceSerialNumber=', 2), '&', 1)
from (
select 'someddata&=somedataagain&deviceSerialNumber=device12345&anotherField=moreData' as params
union all
select 'someddata&=somedataagain&deviceSerialNumber=deviceabcd' as params
) tmp

找到了一个黑客解决方案,该解决方案涉及两个级别的查询,以绕过必须使用regexp_subtr。内部查询使用substringposition提取deviceSerialNumber标记后的所有文本。外部查询使用相同的两个函数在下一个&之后截断任何文本

select substring(pre_serial_num, 1, position('&' in pre_device_id || '&') - 1) as device_id
from
(select substring(session_tags,position('deviceSerialNumber' in session_tags) + 20, 40) as pre_device_id 
from table) a

例如,内部查询需要

someddata&=somedataAgain&device序列号=device12345&otherField=moreData

someddata&=somedataAgain&deviceSerialNumber=deviceabcd

并在设备序列号标签之前去除文本以为您提供

device12345&otherField=moreData

设备ABCCD

然后,第二个查询将去除设备序列号标记后的文本,以便为您提供

设备

序列号=设备12345

device序列号=deviceabcd

最新更新