在正则表达式中向前看



Oracle 的正则表达式中是否有诸如 look-fored、look-back 之类的东西,例如某些语言中的 ?<=

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

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

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

仅当"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' )

如果 ef 之前是以下字符 a 或 b 或 2 的 2 到 5 倍,则在 ly 上查找 ef ([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' )

仅当在 [AB2]{2,5} 之前查找 [EFG]{4,6}

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

最新更新