在plsql中使用REGEXP\u SUBSTR从字符串中提取数字(使用不同的分隔符)

在plsql中使用REGEXP\u SUBSTR从字符串中提取数字(使用不同的分隔符),regex,oracle,plsql,oracle10g,Regex,Oracle,Plsql,Oracle10g,我需要从I/p字符串中提取有图案的数字。我有以下几种模式: xxx xxx xxxx xxx xxx xxxx xxx xxx xxxx 我正在使用此查询查找匹配字符串: select REGEXP_substr('phn: 678 987-0987 Date: 12/2029', '[0-9]{3}(\-|\ |\ )[0-9]{3}(\-|\--|\ )[0-9]{4}') from dual; 我还想提取以下模式: xxxxxx-xxxx XXXXXX

我需要从I/p字符串中提取有图案的数字。我有以下几种模式: xxx xxx xxxx xxx xxx xxxx xxx xxx xxxx

我正在使用此查询查找匹配字符串:

select REGEXP_substr('phn: 678 987-0987 Date: 12/2029',
                 '[0-9]{3}(\-|\  |\ )[0-9]{3}(\-|\--|\ )[0-9]{4}')
from dual;
我还想提取以下模式: xxxxxx-xxxx XXXXXXXXX 等等

在哪里修改查询?

将正则表达式更改为

[0-9]{3}(\-|\  |\ )?[0-9]{3}(\-|\--|\ )?-?[0-9]{4}

\-|\|\?将整个组变为可选组。和-?转弯-可选。功能?在字符文本之后,它将前面的标记作为可选标记。

正则表达式并不总是一个好方法,因为它们是高资源消耗特性。我仍然会使用旧的SUBSTR+INSTR技术:

16777216 * to_number(substr(ip, 1, instr(ip, '.', 1, 1) - 1))
     + 65536 * to_number(substr(ip, instr(ip, '.', 1, 1) + 1, instr(ip, '.', 1, 2) - instr(ip, '.', 1, 1) - 1))
     + 256 * to_number(substr(ip, instr(ip, '.', 1, 2) + 1, instr(ip, '.', 1, 3) - instr(ip, '.', 1, 2) - 1))
     + to_number(substr(ip, instr(ip, '.', 1, 3) + 1))
IP是一个简单的32位4字节整数;以虚线四元格式显示。 每个字节将包含一个介于0和255之间的值。
因此,转换为数字并在两者之间使用是尽可能有效的。

您编写了代码,为什么不更清楚呢?请看,谢谢!!顺便问一下,这是什么?-?你是说这里?谢谢!我很困惑。。。我将正则表达式修改为[0-9]{3}\?-?\?[0-9]{3}\?-?\?\?[0-9]{4}