【问题标题】:Oracle 10g SQL regexp likeOracle 10g SQL 正则表达式
【发布时间】:2013-12-20 23:29:31
【问题描述】:

我想问一下,如果有 3 个集合实例,是否可以在正则表达式中识别给定数字。

例如:

123456141414
123456171717

在上面的示例中,我们有 3x14 和 3x17,因此它应该返回 regexp_like 查询中的数字。

但它应该返回所有出现 3 次相同数字的次数。

【问题讨论】:

  • 有任何代码可以显示您当前的尝试吗?

标签: mysql sql regex oracle oracle10g


【解决方案1】:

请试试这个:

SELECT INPUT_TEXT, REGEXP_SUBSTR(INPUT_TEXT, '([[:digit:]]{2})\1\1', 6) EXTRACTED
FROM MY_TABLE
WHERE REGEXP_INSTR(INPUT_TEXT, '([[:digit:]]{2})\1\1', 6) > 0

输入表值:

 INPUT_TEXT
--------------
 123456141414
 123456171717
 123456111111
 141414123456
 123456121234

查询结果:

 INPUT_TEXT        EXTRACTED
--------------   --------------
 123456111111       111111
 123456141414       141414
 123456171717       171717

【讨论】:

  • 嗨,谢谢 Reza,但该模式只有 12 位数字,您的建议也会返回一个匹配模式,例如 111。在给定的 12 位模式中,它应该找到最后 8 位数字,如(XXXXXX111111、XXXXXX121212 等)。非常感谢您的支持。
  • 如果你只需要捕捉两位数的三元组,那么使用这个表达式:([[:digit:]]{2})\1\1
  • 几乎不错,但仍然返回仅匹配 2 次双位数而不是 3 次的模式。
  • 我忘了说匹配应该只对最后 6 位有效,它不应该包括前 6 位。
  • @user1814129 更新了帖子。希望这是你想要的。
【解决方案2】:

如果我正确阅读了您更新后的要求,您正在检查您是否有六位数字,然后是一对重复三次的数字。在这种情况下,应将 Reza 的响应修改为:

select * from (
select '123456343434' str from dual union all
select '123456555555' str from dual union all
select '1234565555550' str from dual union all
select '123456232324' str from dual union all
select '123456111110' str from dual )
where regexp_like(str,'^([[:digit:]]{6})([[:digit:]]{2})\2\2$')

给出:

STR          
123456343434 
123456555555 

编辑添加 - 如果您想提取重复的实际数字对:

select regexp_replace(str,'^([[:digit:]]{6})([[:digit:]]{2})\2\2$','\2') result 
from (
select '123456343434' str from dual union all
select '123456555555' str from dual union all
select '123456555555a' str from dual union all
select '123456232324' str from dual union all
select '123456111110' str from dual )
where regexp_like(str,'^([[:digit:]]{6})([[:digit:]]{2})\2\2$')

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多