检查此主题后我来到这里: 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;
答案 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;