使用REGEXP_SUBSTR获取子字符串

时间:2018-11-12 13:25:29

标签: sql oracle regexp-replace

我需要使用regexp_substr,但不能正确使用

我在(l.id)列中有数字,例如:

1234567891123!123  EXPECTED OUTPUT: 1234567891123
123456789112!123   EXPECTED OUTPUT: 123456789112
12345678911!123    EXPECTED OUTPUT: 12345678911
1234567891123!123  EXPECTED OUTPUT: 1234567891123

我要在感叹号(!)之前使用regexp_substr

SELECT REGEXP_SUBSTR(l.id,'[%!]',1,13)  from l.table

可以吗?

5 个答案:

答案 0 :(得分:3)

您可以尝试使用INSTR() and substr()

DEMO

select substr(l.id,1,INSTR(l.id,'!', 1, 1)-1) from dual

答案 1 :(得分:3)

您要删除感叹号和所有后续字符。就是这样:

select regexp_replace(id, '!.*', '') from mytable;

答案 2 :(得分:1)

像定界字符串一样看它,其中的bang是定界符,并且您想要第一个元素,即使它为NULL。确保测试所有可能性,甚至是意外的可能性(总是期待意外的结果)!这里的假设是,如果没有定界符,您会想要什么。

regex返回第一个元素,后跟爆炸或行尾。请注意,这种形式的正则表达式会处理NULL首个元素。

SQL> with tbl(id, str) as (
      select 1, '1234567891123!123' from dual union all
      select 2, '123456789112!123' from dual union all
      select 3, '12345678911!123' from dual union all
      select 4, '1234567891123!123' from dual union all
      select 5, '!123' from dual union all
      select 6, '123!' from dual union all
      select 7, '' from dual union all
      select 8, '12345' from dual
   )
   select id, regexp_substr(str, '(.*?)(!|$)', 1, 1, NULL, 1)
   from tbl
   order by id;

        ID REGEXP_SUBSTR(STR
---------- -----------------
         1 1234567891123
         2 123456789112
         3 12345678911
         4 1234567891123
         5
         6 123
         7
         8 12345

8 rows selected.

SQL>

答案 3 :(得分:0)

如果我理解正确,这就是您想要的模式:

SELECT REGEXP_SUBSTR(l.id,'^[^!]+', 1) 
FROM (SELECT '1234567891123!123' as id from dual) l

答案 4 :(得分:0)

如果您想使用REGEXP_SUBSTR而不是regexp_replace,则可以使用

SELECT REGEXP_SUBSTR(l.id,'^\d+')

假设您只有!前的数字