【问题标题】:Oracle regular expression replacement for negative lookahead/lookbehindOracle 正则表达式替换负前瞻/后瞻
【发布时间】:2013-06-10 04:40:02
【问题描述】:

我正在编写一个 PL/SQL Oracle 过程,它在列中查找可能的客户编号。客户编号的长度为 7 位数,并且可以带有任意数量的字符前缀或后缀。但是一些值包含 > 7 位数字,在这些情况下,我想忽略它们。所以 "A/C 1234567" 和 "Cust1234567B" 应该返回与客户编号 1234567 的匹配项,但是 "01234567" 和 " 123456789”不应该。

我正在使用\d{7},但这会返回所有示例的匹配项,因此我正在寻找类似于(?<!\d)\d{7}(?!\d) 的内容 - 但不支持负前瞻和后瞻。有什么建议吗?

【问题讨论】:

  • (?:^|\D)\d{7}(?:\D|$) ?
  • @zerkms:我认为您应该将其发布为答案。 :-)

标签: regex oracle


【解决方案1】:

如果没有可用的lookahed和lookbehind断言,您可以尝试

(^|\D)\d{7}(\D|$)

http://sqlfiddle.com/#!4/d41d8/12114/0

【讨论】:

  • 尝试以下操作: SELECT 'Matched' AS RESULT FROM DUAL WHERE REGEXP_LIKE(' 1234567 ', '(?:^|\D)\d{7}(?:\D|$)' ); ...不返回匹配的
  • 在我的测试中,我发现它并没有完全返回我需要的东西,例如“Cust1234567B”返回“t1234567B”。所以我用另一个 REGEXP_SUBSTR 包围它,例如 REGEXP_SUBSTR(REGEXP_SUBSTR('Cust1234567B', '(?:^|\D)\d{7}(?:\D|$)'), '\d{7}' ) 只需拉出 7 位数字。如果它们存在于原始中,有没有办法排除返回第一个和最后一个非数字字符?
  • @Laurence:如果 oracle 支持 ?:,你记得我们应该删除它
【解决方案2】:

我遇到了同样的问题,我所做的只是

NOT regexp_like(<pattern_you_want_to_negate>)

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多