Oracle正则表达式中的Lookahead

4
我有一个关于Oracle正则表达式的问题。我有许多不同表格中的电话号码。现在我的任务是将它们统一。所以我去掉所有空格、下划线、破折号等等。但是接下来就变得棘手了——这似乎一开始很容易。
电话号码既有国际代码,也有没有国际代码的,例如0046812345678和0812345678。因此,我想用'0046'替换一个单独的(!)前导零。我认为^0(?=[1-9])可以完成工作,但Oracle似乎认为先行断言是无用的。(^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或其他内容。 - Martin Ender
作为另一个改进,您可以尝试使用^0([0-9]{9})$和替换为'0046\1' - shyam
@shyam,这可能太严格了...电话号码的长度可以相差很大。 - Martin Ender
@m.buettner 好的。我只是想解决“0”也可以成为电话号码的一部分的事实...因此有长度限制。 - shyam
1个回答

6

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

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

Result: 0046812345678


测试了一些不同的数字和情况,看起来它能够正常工作!非常感谢您的回复和快速响应! :-) - user2298686

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接