在正则表达式中向前看
Look ahead in regular expression
有些语言的?<=
之类的Oracle正则表达式有没有look-ahead、look-behind之类的东西?
例如,我们只想在 "ef" 之前查找 "ab" 而不是 "cd"。
在REGEXP_REPLACE
中,我们可以通过引用第n组来做到这一点,但是REGEXP_INSTR
和REGEXP_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}' ) )
有些语言的?<=
之类的Oracle正则表达式有没有look-ahead、look-behind之类的东西?
例如,我们只想在 "ef" 之前查找 "ab" 而不是 "cd"。
在REGEXP_REPLACE
中,我们可以通过引用第n组来做到这一点,但是REGEXP_INSTR
和REGEXP_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}' ) )