我有'ABCD 3/1'形式的输入。 我需要在'/'之前解析数字,如果输入与此模式不匹配,则返回原始字符串本身。
我正在使用下面的查询,这是有效的,但我会相信任何提示都可以在单个正则表达式中实现这一点。
select nvl(REGEXP_substr(REGEXP_substr('ABCD 3/1', '\d\/'), '\d'), 'ABCD 3/1') from dual;
答案 0 :(得分:2)
您可以通过映射所有输入字符串并仅选择所需的部分来尝试使用REGEXP_REPLACE
;例如,鉴于此:
SQL> select regexp_replace('ABCD 3/1', '([A-Z]*)( )(\d)(\/)(\d)', '1:\1, 2:\2, 3:\3, 4:\4, 5:\5') from dual ;
REGEXP_REPLACE('ABCD3/1','
--------------------------
1:ABCD, 2: , 3:3, 4:/, 5:1
您可以使用'\3'
仅获取第三个匹配的正则表达式:
SQL> select regexp_replace('ABCD 3/1', '([A-Z]*)( )(\d)(\/)(\d)', '\3') from dual ;
R
-
3
答案 1 :(得分:2)
这个怎么样?我相信它符合您的要求。根据with子句添加更多测试用例。
SQL> with tbl(str) as (
select 'ABCD 3/1' from dual union
select 'ABCD 332/1' from dual union
select 'ABCD A/1' from dual union
select 'ABCD EFS' from dual
)
select regexp_replace(str, '.*\s(\d)/\d.*', '\1') digit_before_slash
from tbl;
DIGIT_BEFORE_SLASH
-----------------------------------------------------------------------------
3
ABCD 332/1
ABCD A/1
ABCD EFS
SQL>