错误数据中的 oracle phone 数字格式正则表达式

oracle phone number format reg exp in wrong data

看完这个话题我就来了: Regular Expression that includes plus sign and decimal

我的主要问题如下,我有错误的迁移数据需要修复。 对于 phone 个数字,我们有一些字母和特殊字符需要删除。

想象一下,例如这将是数据:

s#sdads+#09232342a

我只想得到+和数字 + 必须是可选的。

http://www.techonthenet.com/oracle/functions/regexp_substr.php https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm

如果我阅读 oracle 的文档,这应该很容易,但我不能让它工作,我一定是遗漏了一些基本的东西。 有什么想法吗?

下面是我尝试过的一些示例:

select regexp_substr('s#sdads+#09232342a','\+*[0-9]+') from dual;

returns

09232342

我原以为它会考虑 + 我还尝试将 + 放在测试字符串的开头,但没有区别。 将正则表达式更改为

也是如此
[\+]*[0-9]+  or [+]*[0-9]+ or (\+)*(\d)+

结果没有区别。

让我感到困惑的部分是,如果我更改测试字符串和正则表达式这个 returns + 并且只加上

select regexp_substr('+s#sdads+#09232342a','?[\+]*') from dual;

但是如果我把开头的 + 移开就没了

另外,如果我将数字放在那里,则只考虑数字:

select regexp_substr('+s#sdads+#09232342a','?[\+]*(\d)+') from dual;

这也没有用:

select regexp_substr('+s#sdads+#09232342a','?[\+]{0,1}(\d)+') from dual;

您在 + 和您需要考虑的数字之间有一个 # 字符:

查询 1 - 替换所有不需要的字符:

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL

输出:

++09232342

查询 2 - 匹配整个字符串:

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '' )
FROM   DUAL

输出:

+09232342

查询 3 - 匹配子串:

SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL

(然后您可以通过将该语句包装在另一个替换中来替换无关的 #

输出:

+#09232342

问题在于,在您的所有尝试中,您都在寻找 + 后跟数字。这样的事情应该有效:

select regexp_substr('+s#sdads+#09232342a', '\+') || 
       regexp_substr('+s#sdads+#09232342a', '\d+') from dual;