在oracle中使用Regexp来匹配字符串

时间:2018-03-19 18:20:18

标签: regex oracle

我正在尝试在oracle中创建一个RegExp,以匹配具有以下条件的字符串,

长度为11个字符 除了(S,L,O,I,B和Z)之外,2,5,8,9个字符是字母[A-Z] 1,4,7,10,11个字符是数字[0-9] 第3和第6将是数字或字母。

2 个答案:

答案 0 :(得分:2)

您希望将以下正则表达式与REGEXP_LIKE()REGEXP_SUBSTR()等一起使用:

^[0-9][AC-HJKMNP-RT-Y][A-Z0-9][0-9][AC-HJKMNP-RT-Y][A-Z0-9][0-9][AC-HJKMNP-RT-Y]{2}[0-9]{2}$

希望这有帮助。

答案 1 :(得分:1)

制作精美的角色列表

我只是制作一个花哨的字符列表,不包括您引用的字母大写字母。这类似于David Faber的回答。

这是我喜欢的角色列表:

- '[AC-HJKMNPQRT-Y]' - Oracle的文档说明连字符的特殊之处在于它在此字符列表中形成一个范围。

为了使这个模式简洁,我注意到在大多数情况下,这个字符串遵循数字,字母,字母模式的模式。因此,我将其置于子表达式分组中,该分组发生2次(量词跟随)。

       SCOTT@db>WITH smple AS (
  2      SELECT
  3          '123456789ab' tst
  4      FROM
  5          dual
  6      UNION ALL
  7      SELECT
  8          '1CC4DD7EE01'
  9      FROM
 10          dual
 11      UNION ALL
 12      SELECT
 13          '1CB4DD7EE01'
 14      FROM
 15          dual
 16      UNION ALL    
 17      SELECT
 18          '1C44D67EE01'
 19      FROM
 20          dual    
 21  ) SELECT
 22      smple.tst,
 23      regexp_substr(smple.tst,'^(\d[AC-HJKMNPQRT-Y](\d|[AC-HJKMNPQRT-Y])){2}\d[AC-HJKMNPQRT-Y]{2}\d{2}$') matching
 24    FROM
 25      smple;
TST           MATCHING      
-------------------------
123456789ab                 
1CC4DD7EE01   1CC4DD7EE01   
1CB4DD7EE01                 
1C44D67EE01   1C44D67EE01