我试图寻找一个很好的文档来匹配在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。但是我得到的是:
我想要的是是否可以出现“ _”,但是如果第一组后面有字符,则必须只出现一次。
有没有一种干净的方法?
答案 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