【问题标题】:Lookahead in Oracle's regular expressionsOracle 正则表达式中的前瞻
【发布时间】:2013-04-19 10:24:29
【问题描述】:

Oracle 的正则表达式有问题。我在不同的桌子上有很多电话号码。现在我的任务是统一它们。所以我去掉了所有的空格、下划线、减号等等。但随后棘手的部分来了 - 一开始似乎很容易。

有带和不带国际代码的数字,例如0046812345678 和 0812345678。所以我想用“0046”替换一个(!)前导零。我认为^0(?=[1-9]) 会完成这项工作,但甲骨文似乎认为前瞻是无用的。 (^0)(1|2|3|4|5|6|7|8|9) 也不起作用(或 (^01|02|03|04|05|06|07|08|09) 就此而言),因为它将替换第一个非零数字以及将 0812345678 变为 004612345678(因此,第一个“8”消失了)。

我已经搜索并尝试了很长时间,但无法提供更多可能性。任何帮助将不胜感激。提前致谢!

【问题讨论】:

  • 我不了解oracle,但通常可以参考替换字符串中的捕获组。例如,模式 ^0([1-9]) 和替换 0046$10046\1 或其他东西。
  • 作为另一项改进,您可以尝试^0([0-9]{9})$ 并替换为'0046\1'
  • @shyam 这可能太严格了……电话号码的长度可以变化很大。
  • @m.buettner 好的。我只是想解决一个事实,即0 也可以是电话号码其余部分的一部分......因此长度限制

标签: regex oracle phone-number


【解决方案1】:

您需要将前 1-9 添加到结果中,以便仅匹配以单个 0 开头的数字。为了保留前 1-9,我们捕获它(使用括号)并将其添加到替换部分(使用 \1)。这似乎有效:

select regexp_replace('0812345678', '^0([1-9])', '0046\1') from dual;

结果:0046812345678

【讨论】:

  • 测试了一些不同的数字和情况,它似乎工作!非常感谢您的回复和这么快! :-)
猜你喜欢
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多