在正则表达式中向前看

Look ahead in regular expression

有些语言的?<=之类的Oracle正则表达式有没有look-ahead、look-behind之类的东西?

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

REGEXP_REPLACE中,我们可以通过引用第n组来做到这一点,但是REGEXP_INSTRREGEXP_SUBSTR呢?

示例:查找 ef 的位置,如果它是 abef 而不是 cdef。我知道对于这个例子,我们可以寻找 abef 并偏移 2,但这是一个简单的例子。有时无法抵消。我手头没有一个好的场景,但让我们说:寻找 ef 如果它是以下字符 a 或 b 或 2 ([ab2] 的 2 到 5 倍之前){2,5}

look for "ef" only if before it is "ab" and not "cd"

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

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

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

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

Look for ef on ly if before it is 2 to 5 times of the following characters a or b or 2 ([ab2]){2,5}

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

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

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

looking for [efg]{4,6} only if before it is [ab2]{2,5}

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

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}' ) )