我正在尝试提取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
。内部查询使用substring
和position
提取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