您好,我只需要 1 个表达式来满足以下所有 3 个条件。字符串将始终以CALL
或开头(
会Replace
更好地工作或Substr
1) 在 ) 之后选择 4 个字符
2)在RX后选择4个字符:
3) 在 PASS 前选择 4 个字符 例如:
CALL RX: W234 =>W234
(S123) T123 #100 =>T123
CALL Y123 PASS =>Y123
CALL Q12 PASS =>Q12
我试过我试过 Replace REGEXP_REPLACE(text,'CALL (RX:)?|PASS|\(.*\)|[[:punct:]].*')
。但它没有为此字符串提取 LXC2 (D123) LXC2 99
这是一个单线。公共表表达式(with 子句)只是为了举例而设置数据集:
with tbl(idx, data) as (
select 1, 'CALL RX: W234' from dual union all
select 2, '(S123) T123 #100' from dual union all
select 3, 'CALL Y123 PASS' from dual union all
select 4, 'CALL Q12 PASS' from dual union all
select 5, '(D123) LXC2 99' from dual
)
select idx,
regexp_substr(data, '^(CALL|\(.*?\)) (RX: )?(.*?)( |PASS|$)', 1, 1, null, 3) result
from tbl;
IDX RESULT
---------- ----------------
1 W234
2 T123
3 Y123
4 Q12
5 LXC2
5 rows selected.
它使用组来匹配'CALL'
以括号内的任何字符或一组任何字符开头的行,后跟一个空格,然后是一个可选的'RX:
'字符串。'PASS'
非贪婪地捕获下一组后跟空格、字符串或行尾的字符。这恰好是第 6 个参数返回的第三组。
请注意,这适用于您提供的示例数据集。如果您有不同的示例,您可能需要对正则表达式进行一些调整。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句