oracle电话号码格式reg exp在错误数据中

oracle电话号码格式reg exp在错误数据中,oracle,phone-number,regexp-substr,Oracle,Phone Number,Regexp Substr,我在检查完这个主题后来到这里: 我的主要问题是,我有错误的迁移数据,需要修复。 对于电话号码,我们有一些字母和特殊字符需要删除 例如,设想以下数据: s#sdads+#09232342a 我只想得到+和数字 +必须是可选的 如果我阅读了oracle的文档,这应该很容易,但我不能让它工作,我一定缺少一些基本的东西。 有什么想法吗 下面是我尝试过的一些例子: select regexp_substr('s#sdads+#09232342a','\+*[0-9]+') from dual;

我在检查完这个主题后来到这里:

我的主要问题是,我有错误的迁移数据,需要修复。 对于电话号码,我们有一些字母和特殊字符需要删除

例如,设想以下数据:

s#sdads+#09232342a
我只想得到+和数字 +必须是可选的

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

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

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

09232342
我希望它能考虑+。 我还尝试将+放在测试字符串的开头,没有区别。 将regexp更改为

[\+]*[0-9]+  or [+]*[0-9]+ or (\+)*(\d)+
结果没有差别

让我困惑的是,如果我更改测试字符串和regexp,它将返回+并且只返回加号

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
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
输出

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
查询2-匹配整个字符串

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
输出

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
查询3-匹配子字符串

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
(然后可以通过将该语句包装到另一个replace中来替换无关的
#

输出

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
+
和需要说明的数字之间有一个
#
字符:

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

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
输出

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
查询2-匹配整个字符串

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
输出

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
查询3-匹配子字符串

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342
(然后可以通过将该语句包装到另一个replace中来替换无关的
#

输出

SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '[^+0-9]' )
FROM   DUAL
++09232342
SELECT REGEXP_REPLACE( '+s#sdads+#09232342a', '^.*?(\+?)#(\d+).*$', '\1\2' )
FROM   DUAL
+09232342
SELECT REGEXP_SUBSTR( '+s#sdads+#09232342a', '\+?#\d+' )
FROM   DUAL
+#09232342

问题是,在所有的尝试中,您都在寻找+后跟数字。像这样的方法应该会奏效:

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

问题是,在所有的尝试中,您都在寻找+后跟数字。像这样的方法应该会奏效:

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

它已经修好了,谢谢大家。它已经修好了,谢谢大家