在Oracle中匹配regexp_like的模式以有条件地包含一组字符

时间:2019-05-21 13:20:31

标签: regex oracle

我试图寻找一个很好的文档来匹配在Oracle中使用regexp_like的匹配模式。我找到了一些并按照他们的指示进行操作,但看起来我错过了一些内容,或者指示内容不全面。 让我们来看这个例子:

SELECT * FROM
(
 SELECT 'ABC' T FROM DUAL
 UNION
 SELECT 'WZY' T FROM DUAL
 UNION
 SELECT 'WZY_' T FROM DUAL
 UNION
 SELECT 'WZYEFG' T FROM DUAL
 UNION
 SELECT 'WZY_EFG' T FROM DUAL
 ) C
 WHERE regexp_like(T, '(^WZY)+[_]{0,1}+[A-Z]{0,6}')

我希望收到的是WZY和WZY_EFG。但是我得到的是:

enter image description here

我想要的是是否可以出现“ _”,但是如果第一组后面有字符,则必须只出现一次。

有没有一种干净的方法?

1 个答案:

答案 0 :(得分:1)

使用子表达式分组以确保_字符仅与大写字母字符一起出现

是的,您的模式无法解决所需的条件逻辑(仅在紧跟大写字母字符的情况下,才看到_

使用大写字母字符列表将_字符放入子表达式分组会强制这种逻辑。

最后,将行尾放置在零匹配的情况下。

SCOTT@DB>SELECT                                         
  2      *                                                  
  3  FROM                                                   
  4      (                                                  
  5          SELECT 'ABC' t FROM dual                       
  6          UNION ALL                                      
  7          SELECT 'WZY' t FROM dual                       
  8          UNION ALL                                      
  9          SELECT 'WZY_' t FROM dual                      
 10          UNION ALL                                      
 11          SELECT 'WZYEFG' t FROM dual                    
 12          UNION ALL                                      
 13          SELECT 'WZY_EFG' t FROM dual                   
 14      ) c                                                
 15  WHERE                                                  
 16      REGEXP_LIKE ( t, '^(WZY)+([_][A-Z]{1,6}){0,1}$' );  
         T                                                  
__________                                                  
WZY                                                         
WZY_EFG