询问:
select 1 "val" from dual where regexp_like('ITEM HEIGHT','^(?!ICON).*HEIGHT$');
上面的查询没有返回 me 1
。请让我知道如何使用 oracle 实现负前瞻regexp_like()
。
注意:请不要建议对查询进行任何更改,我很想知道regexp_like()
负前瞻接受的正确正则表达式。此外 [^] 似乎仅逐个字符否定而不是整个字符串。
询问:
select 1 "val" from dual where regexp_like('ITEM HEIGHT','^(?!ICON).*HEIGHT$');
上面的查询没有返回 me 1
。请让我知道如何使用 oracle 实现负前瞻regexp_like()
。
注意:请不要建议对查询进行任何更改,我很想知道regexp_like()
负前瞻接受的正确正则表达式。此外 [^] 似乎仅逐个字符否定而不是整个字符串。
正如其他人所提到的,Oracle 正则表达式不直接支持零宽度断言。
在某些情况下,您可以将要检查的内容拆分为多个表达式。对于您提供的示例,您可以执行以下操作:
select 1 "val"
from dual
where NOT regexp_like('ITEM HEIGHT','^ICON')
and regexp_like('ITEM HEIGHT','HEIGHT$');
如果您确实需要在单个表达式中执行此操作,则可以使用字符类的交替来一次检查一个字母,如下所示:
select 1 "val"
from dual
where regexp_like('ITEM HEIGHT','^([^I]|I[^C]|IC[^O]|ICO[^N]).*HEIGHT$');
基本上这个表达式的第一部分是检查:
显然,这种方法很快就会变得很麻烦,但在某些情况下它仍然会有所帮助。
Oracle 不支持正则表达式中的前瞻 - 相反,您可以检查下一个字符是否不是您要排除的字符:
select 1 "val"
from dual
where regexp_like('ac','a([^b]|$)');