我试图查找有关在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。但我得到的是:
我想要的是"_“可以存在也可以不存在,但如果第一组后面有字符,则它必须只出现一次。
有没有一种干净利落的方法呢?
发布于 2019-05-22 01:27:38
使用子表达式分组以确保 _
字符仅与大写字母字符一起显示
是的,您的模式不能满足您所需的条件逻辑(仅当后面跟着大写字母字符时才能看到_
)。
将带有大写字母字符列表的_
字符放入子表达式分组中会强制执行此逻辑。
最后,放置行尾锚点来解决零匹配的情况。
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
https://stackoverflow.com/questions/56239251
复制相似问题