如何在Oracle regexp_like()中进行否定的前瞻,'?!' 没用

use*_*301 2 oracle negative-lookahead regexp-like

查询:

select 1 "val" from dual where regexp_like('ITEM HEIGHT','^(?!ICON).*HEIGHT$'); 
Run Code Online (Sandbox Code Playgroud)

上面的查询没有返回我1。请让我知道如何使用oracle实现负前瞻regexp_like()

注意:请不要在查询中提出任何建议,我很想知道正确的正则表达式可以接受regexp_like()否定超前。而且[^]似乎只逐个字符地求反,而不是整个字符串。

ace*_*ero 6

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

在某些情况下,您可以将要检查的内容拆分为多个表达式。对于您给出的示例,您可以执行以下操作:

select 1 "val"
 from dual
where NOT regexp_like('ITEM HEIGHT','^ICON')
  and regexp_like('ITEM HEIGHT','HEIGHT$');
Run Code Online (Sandbox Code Playgroud)

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

select 1 "val"
 from dual
where regexp_like('ITEM HEIGHT','^([^I]|I[^C]|IC[^O]|ICO[^N]).*HEIGHT$');
Run Code Online (Sandbox Code Playgroud)

基本上,该表达式的第一部分是检查以下内容:

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

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