这是一种方法:
WITH sample_data AS (select 'TX353 G35 1992' str from dual union all
select 'Ref QP141 B151 R4 1956' str from dual union all
select 'RM216 M285 K5 1996' str from dual union all
select 'T385 C22 1960' str from dual union all
select 'Ths LB500 M200 A5 1998' str from dual union all
select 'X12345' str from dual union all
select 'Y F123' str from dual)
SELECT str,
regexp_substr(str, '([A-Z]{1,2})[[:digit:]]*( |$)', 1, 1, NULL, 1) sub_str
FROM sample_data;
STR SUB_STR
---------------------- ----------------------
TX353 G35 1992 TX
Ref QP141 B151 R4 1956 QP
RM216 M285 K5 1996 RM
T385 C22 1960 T
Ths LB500 M200 A5 1998 LB
X12345 X
Y F123 Y
这会查找一个或两个大写字母后跟 0 个或多个数字后跟空格或行尾的模式。(如果要将位数限制为 1 位或更多位,请将 更改*
为 a +
。)
我们在“一个或两个大写字母”周围加上括号,将其标记为子表达式,然后我们可以请求在 regexp_substr 中输出(这是最后一个参数,在我们的例子中是 1,因为我们想要的子表达式是第一个遇到一个)。
如果您有其他特殊字符可以遵循您想要的模式,那么您可以简单地扩展 OR 部分(当前( |$)
),例如,如果您想包含问号,OR 部分将变为( |?|$)