我试图提取deviceSerialNumber=
之后的文本,直到&
或字符串结尾。数据看起来像
someddata&安培; =&somedataagain放大器; deviceSerialNumber = device12345&安培; anotherField = MOREDATA someddata&安培; =&somedataagain放大器; deviceSerialNumber = deviceabcd
我试过这个
REGEXP_SUBSTR(session_tags || '&', 'deviceSerialNumber(.*)&') from table
但是,这将返回所有文本,直到最后的&
(这是字符串的结尾,因为我为了模式匹配目的而附加&
)。如何修改此正则表达式以仅提取文本,直到第一个&
?
答案 0 :(得分:1)
我知道现在响应已经晚了,但这是对我有用的解决方案。
select regexp_substr('someddata&= somedataagain&deviceSerialNumber = device12345&anotherField = moreData','deviceSerialNumber =(。*)&',0,1,'e');
答案 1 :(得分:0)
使用出现参数
REGEXP_SUBSTR(session_tags, 'deviceSerialNumber=(.+?)&',1,1) from table
或者
REGEXP_SUBSTR(session_tags,(?<=deviceSerialNumber=)(.*?)(?=&)) from table
.*
将匹配到最后一个&amp;并且.*?
将匹配到第一个&amp;
答案 2 :(得分:0)
我遇到了与Invalid preceding regular expression prior to repetition operator
相同的regexp_substr
。
我最终选择的解决方案是两个嵌套的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
答案 3 :(得分:-1)
找到一个涉及两级查询的黑客解决方案,以便使用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&amp; = somedataagain&amp; deviceSerialNumber = device12345&amp; anotherField = moreData
someddata&安培; =&somedataagain放大器; deviceSerialNumber = deviceabcd
并在设备序列号标签前删除文本以便
device12345&amp; anotherField = moreData
deviceabcd
第二个查询然后在设备序列号标签后删除文本
deviceSerialNumber = device12345
deviceSerialNumber = deviceabcd