【问题标题】:Extract number (with different delimiters) from string using REGEXP_SUBSTR in plsql在 plsql 中使用 REGEXP_SUBSTR 从字符串中提取数字(具有不同的分隔符)
【发布时间】:2014-11-09 04:42:29
【问题描述】:

我需要从 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
等等……

在哪里修改查询?

【问题讨论】:

标签: regex oracle plsql oracle10g


【解决方案1】:

将您的正则表达式更改为,

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

DEMO

(\-|\ |\ )? 将整个组变为可选。并且-?- 变为可选。 ?在字符文字后的作用是使前面的token成为可选的。

【讨论】:

  • 谢谢!!对了,这里?-?是什么意思?
  • 谢谢!我很困惑...我将正则表达式修改为[0-9]{3}\ ?-?(\ )?[0-9]{3}\ ?-?(\ )?[0-9]{4}
【解决方案2】:

正则表达式并不总是一个好方法,因为它们是高资源消耗特性。我仍然会使用旧的 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 之间的值。 因此转换为数字并使用 between 尽可能高效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2021-07-31
    • 2012-06-26
    • 2015-01-29
    相关资源
    最近更新 更多