3

询问:

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

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

注意:请不要建议对查询进行任何更改,我很想知道regexp_like()负前瞻接受的正确正则表达式。此外 [^] 似乎仅逐个字符否定而不是整个字符串。

4

2 回答 2

8

正如其他人所提到的,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$');

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

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

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

于 2018-07-23T19:31:53.150 回答
2

Oracle 不支持正则表达式中的前瞻 - 相反,您可以检查下一个字符是否不是您要排除的字符:

select 1 "val"
from   dual
where  regexp_like('ac','a([^b]|$)'); 
于 2017-09-26T14:03:24.123 回答