我需要从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
等...
我在哪里修改查询?
答案 0 :(得分:2)
将正则表达式更改为,
[0-9]{3}(\-|\ |\ )?[0-9]{3}(\-|\--|\ )?-?[0-9]{4}
(\-|\ |\ )?
将整个群组视为可选。 -?
将-
视为可选项。 ?
在字符文字后面的函数是,它将前面的标记作为可选。
答案 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之间的值。 所以转换为数字&使用两者之间的效率尽可能高。