使用正则表达式解析更简单的方法

时间:2016-02-17 13:09:15

标签: sql regex oracle

我有'ABCD 3/1'形式的输入。 我需要在'/'之前解析数字,如果输入与此模式不匹配,则返回原始字符串本身。

我正在使用下面的查询,这是有效的,但我会相信任何提示都可以在单个正则表达式中实现这一点。

select nvl(REGEXP_substr(REGEXP_substr('ABCD 3/1', '\d\/'), '\d'), 'ABCD 3/1') from dual;

2 个答案:

答案 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>