0

我在检查了这个主题后来到这里: 包含加号和小数的正则表达式

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

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

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;
4

2 回答 2

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
于 2016-04-21T12:04:09.230 回答
1

问题是,在你所有的尝试中,你都在寻找 + 紧随其后的数字。像这样的东西应该工作:

select regexp_substr('+s#sdads+#09232342a', '\+') || 
       regexp_substr('+s#sdads+#09232342a', '\d+') from dual;
于 2016-04-21T12:18:26.113 回答