错误数据中的 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;
看完这个话题我就来了: 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;