在plsql中使用REGEXP\u SUBSTR从字符串中提取数字(使用不同的分隔符)
我需要从I/p字符串中提取有图案的数字。我有以下几种模式: xxx xxx xxxx xxx xxx xxxx xxx xxx xxxx 我正在使用此查询查找匹配字符串:在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
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}