展望正则表达式

时间:2016-04-24 09:22:44

标签: sql regex oracle oracle11g lookahead

在某些语言中,Oracle的正则表达式(例如?<=)中是否存在诸如前瞻,后瞻的内容?

例如,我们想要寻找&#34; ef&#34;只有在它出现之前&#34; ab&#34;而不是&#34; cd&#34;。

REGEXP_REPLACE我们可以通过引用第n组来完成此操作,但REGEXP_INSTRREGEXP_SUBSTR如何?

示例:如果是 abef ,则查找 ef 的位置,而不是 cdef 。我知道在这个例子中,我们可以查找 abef 并偏移2,但这是一个简单的例子。有时候不可能抵消。我手边没有好的场景,但是请说:如果它是以下字符a或b或2的2到5倍之前,请查找 ef ( [AB2]){2,5}

1 个答案:

答案 0 :(得分:3)

  

只有在“ab”而不是“cd”

之前,才会查找“ef”

如果在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' )
  

如果之前是以下字符a或b或2 {2} {2}的2到5倍,请查看ef

([ab2]){2,5}

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

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

只有在[ab2] {2,5}之前寻找[efg] {4,6}

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

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

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