使用plsql中的REGEXP_SUBSTR从字符串中提取数字(使用不同的分隔符)

时间:2014-09-15 15:34:49

标签: 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
XXXXXXXXXX
等...

我在哪里修改查询?

2 个答案:

答案 0 :(得分:2)

将正则表达式更改为,

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

DEMO

(\-|\ |\ )?将整个群组视为可选。 -?-视为可选项。 ?在字符文字后面的函数是,它将前面的标记作为可选。

答案 1 :(得分:0)

正则表达式并不总是一种好方法,因为它们具有高资源消耗功能。我仍然会使用旧的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之间的值。 所以转换为数字&使用两者之间的效率尽可能高。