使用 REGEXP_SUBSTR 获取子字符串

Get substring with REGEXP_SUBSTR

我需要使用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

可以吗?

如果我没理解错的话,这就是你想要的模式:

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

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

DEMO

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

您想删除感叹号和它后面的所有字符。那就是:

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

如果你喜欢使用 REGEXP_SUBSTR 而不是 regexp_replace 那么你可以使用

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

假设您只有 !

之前的数字

将其视为分隔字符串,其中爆炸是分隔符,您需要第一个元素,即使它是 NULL。确保测试所有的可能性,甚至是意想不到的(总是期待意想不到的)!这里的假设是,如果没有定界符,你会想要那里的东西。

正则表达式 returns 第一个元素后跟一个 bang 或行尾。请注意,这种形式的正则表达式处理 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>