【问题标题】:Look ahead in regular expression在正则表达式中向前看
【发布时间】:2016-04-24 09:22:43
【问题描述】:

Oracle的正则表达式如?<=在某些语言中是否有look-ahead、look-behind之类的东西?

例如,我们只想查找“ef”,前提是它之前是“ab”而不是“cd”。

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

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

【问题讨论】:

标签: sql regex oracle oracle11g lookahead


【解决方案1】:

只有在它之前是“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' )

仅当 ef 是以下字符 a 或 b 或 2 ([ab2]){2,5} 的 2 到 5 倍时才查找 ef

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
相关资源
最近更新 更多