2016-04-24 64 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