使用regexp_instr获取字符串中最后一个数字。

9
如果我使用以下表达式,结果应该是1。
regexp_instr('500 Oracle Parkway, Redwood Shores, CA','[[:digit:]]')

有没有办法让它查找字符串中的最后一个数字?如果我要在上面的示例中查找最后一个数字,它应该返回3。

在你的示例中没有3或1,我认为你在使用[[:digit:]]时做了一些奇怪的事情。另外,你首先说结果应该是1,然后又说应该是3。请澄清一下。最后,在最后一个数字后面的字符串中可以有其他非数字字符吗? - Mike Schachter
当我使用不同的字符串(Unit 4/22-24 Adams Pde)运行regexp_instr时,结果为6,在这种情况下,它是第一个数字的索引。 - Anna Lam
1
我在那里打错了一个字。对于提供的示例,它应该返回1。如果我让它查找最后一个数字,它应该返回3-第二个“0”的索引。 - Anna Lam
2个回答

10

如果你使用的是11g版本,那么可以使用regexp_count函数来确定模式在字符串中存在的次数,并将其输入到regexp_instr函数中。

regexp_instr( str,
              '[[:digit:]]',
              1,
              regexp_count( str, '[[:digit:]]')
            )

然而,由于您使用的是10g版本,最简单的选择可能是反转字符串,并从字符串长度中减去找到的位置。

length(str) - regexp_instr(reverse(str),'[[:digit:]]') + 1

在11g中,这两种方法都应该有效。

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select '500 Oracle Parkway, Redwood Shores, CA' str
  3      from dual
  4  )
  5  select length(str) - regexp_instr(reverse(str),'[[:digit:]]') + 1,
  6         regexp_instr( str,
  7                       '[[:digit:]]',
  8                       1,
  9                       regexp_count( str, '[[:digit:]]')
 10                     )
 11*   from x
SQL> /

LENGTH(STR)-REGEXP_INSTR(REVERSE(STR),'[[:DIGIT:]]')+1
------------------------------------------------------
REGEXP_INSTR(STR,'[[:DIGIT:]]',1,REGEXP_COUNT(STR,'[[:DIGIT:]]'))
-----------------------------------------------------------------
                                                     3
                                                                3

3
更省事的另一种解决方案是:
SELECT regexp_instr('500 Oracle Parkway, Redwood Shores, CA','[^[:digit:]]*$')-1 
FROM dual;

这可以理解为...找到字符串末尾的非数字字符。然后减去1。这将给出字符串中最后一个数字的位置..
REGEXP_INSTR('500ORACLEPARKWAY,REDWOODSHORES,CA','[^[:DIGIT:]]*$')-1
--------------------------------------------------------------------
                                                                   3 

我认为这正是您想要的。(在11g上测试过)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接