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

时间:2016-04-21 11:49:31

标签: oracle phone-number regexp-substr

检查此主题后我来到这里: Regular Expression that includes plus sign and decimal

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

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

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;

返回

09232342

我期待它考虑+ 我也尝试将+放在测试字符串的开头,没有区别。 将正则表达式更改为

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

并且结果没有差异。

让我困惑的部分是,如果我更改测试字符串和正则表达式,则返回+并且仅加上

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;

2 个答案:

答案 0 :(得分:1)

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

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

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

<强>输出

++09232342

查询2 - 匹配整个字符串

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

<强>输出

+09232342

查询3 - 匹配子字符串

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

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

<强>输出

+#09232342

答案 1 :(得分:1)

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

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