2016-04-24 61 views
0

在某些语言中是否存在诸如?<=等Oracle的正则表达式中的前瞻,后顾之事?预见正则表达式

例如,我们只想在“ab”而不是“cd”之前查找“ef”。

REGEXP_REPLACE我们可以通过引用第n组来做到这一点,但REGEXP_INSTRREGEXP_SUBSTR怎么样?

示例:寻找EF的位置,如果它是一个ABEF,而不是当它是一个CDEF。我知道这个例子,我们可以寻找abef并且抵消2,但这是一个简单的例子。有时候这是不可能抵消的。我手边没有一个好的方案,但我们可以这样说:如果在之前是以下字符a或b或2的2到5倍([ab2]){2,5}

之前查找 ef
+0

如果它在'ab'之前,那么它不能在'cd'之前。 – MT0

+0

_before IT是ab而不是cd_。 – Kenny

+2

[Oracle正则表达式的味道是POSIX](https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#i1007663),它不支持lookarounds。 –

回答

3

查找“EF”只有之前,它是“AB”,而不是“CD”

如果说之前是ab那么它不能cd之前,所以你可以这样做:

REGEXP_REPLACE(text, '(ab)ef', '\1XX') 

REGEXP_SUBSTR(text, 'ab(ef)', 1, 1, NULL, 1) 

REGEXP_INSTR(text, 'abef', 1, 1, 1, NULL) - LENGTH('ef') 

查找上LY EF如果之前,它是下列字符的2至5倍a或b或2 ([ab2]){2,5}

REGEXP_REPLACE(ly, '([ab2]{2,5})ef', '\1XX') 

REGEXP_SUBSTR(ly, '[ab2]{2,5}(ef)', 1, 1, NULL, 1) 

REGEXP_INSTR(ly, '[ab2]{2,5}ef', 1, 1, 1, NULL) - LENGTH('ef') 

寻找[EFG] {4,6-}仅当之前,它是[AB 2] {2,5-}

REGEXP_REPLACE(ly, '([ab2]{2,5})[efg]{4,6}', '\1XX') 

REGEXP_SUBSTR(ly, '[ab2]{2,5}([efg]{4,6})', 1, 1, NULL, 1) 

REGEXP_INSTR(ly, '[efg]{4,6}', REGEXP_INSTR(ly, '[ab2]{2,5}[efg]{4,6}')) 
+0

你确定这是Oracle吗? _REGEXP_SUBSTR_最多有5个参数。 https://docs.oracle.com/cd/B12037_01/server.101/b10759/functions116。htm 除此之外,如何在仅仅在_ [ab2] {2,5} _ – Kenny

+2

之前寻找_ [efg] {4,6} _ @enny Oracle 11g(在问题中标记的)需要额外的参数 - 要返回的子组的索引。请参见[Oracle 11g'REGEXP_SUBSTR'文档](https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions138.htm) – MT0