首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在oracle regexp_like()中进行负向先行检查,'?!‘是不工作的

如何在oracle regexp_like()中进行负向先行检查,'?!‘是不工作的
EN

Stack Overflow用户
提问于 2017-09-26 21:23:02
回答 2查看 6.5K关注 0票数 3

查询:

代码语言:javascript
复制
select 1 "val" from dual where regexp_like('ITEM HEIGHT','^(?!ICON).*HEIGHT$'); 

上面的查询没有返回1。请告诉我如何使用oracle regexp_like()实现负向先行。

注意:请不要在查询中建议任何更改,我有兴趣知道正确的正则表达式是被regexp_like()接受的负向先行。另外,^似乎只对一个字符求反,而不是对整个字符串求反。

EN

回答 2

Stack Overflow用户

发布于 2018-07-24 03:31:53

正如其他人所提到的,Oracle正则表达式不直接支持零宽度断言。

在某些情况下,您可以将您尝试检查的内容拆分到多个表达式中。对于您给出的示例,您可以这样做:

代码语言:javascript
复制
select 1 "val"
 from dual
where NOT regexp_like('ITEM HEIGHT','^ICON')
  and regexp_like('ITEM HEIGHT','HEIGHT$');

如果您确实需要在单个表达式中执行此操作,则可以使用字符类交替来一次检查一个字母,如下所示:

代码语言:javascript
复制
select 1 "val"
 from dual
where regexp_like('ITEM HEIGHT','^([^I]|I[^C]|IC[^O]|ICO[^N]).*HEIGHT$');

基本上,这个表达式的第一部分是检查:

  • 第一个字符不是“I”
  • 或者第一个字符是"I",但是第二个字符不是“C”
  • 或者前两个字符是"IC",但是第三个字符不是“O”
  • 或者前三个字符是"ICO",但是第四个字符不是“N”

<

  • >F211

显然,这种方法很快就会变得很麻烦,但在某些情况下它仍然是有用的。

票数 8
EN

Stack Overflow用户

发布于 2017-09-26 22:03:24

Oracle不支持正则表达式中的先行处理-相反,您可以只检查下一个字符不是您想要排除的字符:

代码语言:javascript
复制
select 1 "val"
from   dual
where  regexp_like('ac','a([^b]|$)'); 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46427782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档