如何使用REGEXP_SUBSTR得到两个单词之间的数字?

时间:2019-08-05 15:55:20

标签: regex oracle substring

我想检索两个字符串之间的数字序列。文本中可能还有其他数字,我只想获取“ item”和“ n”(首次出现)之间的顺序。而且,序列的长度可以变化。

以下是我尝试过的:

SELECT REGEXP_SUBSTR(clob_text, 'item ([0-9]+?) n') AS my_number FROM my_table WHERE something = something;

但是它返回值“ item 123456789 n”,我只需要数字值。

我也尝试过返回相同的正则表达式'\ item([0-9] +?)\ n'和'(?= item)([0-9] +?)(?= n) '和'\ item /([0-9] +?)/ \ n',则不返回任何内容。

最后,我尝试插入表达式,它可以工作,但并不理想:

SELECT REGEXP_SUBSTR(REGEXP_SUBSTR(clob_text, '\item ([0-9]+?) \n'), '[0-9]+') FROM ...

如何删除这些不需要的字符,使结果只有一个表达式,结果只有“ 123456789”?

示例输入: 'Somdasdas dasd sdaisdjas asod dasdhjs 1564,dasdohndsdias sdasdasdasdasds, ddissd ksdnas滑动为5645 sdnaslndas,ndsadn ndasknd dnsd:sdas 5465 asdasd dnaskldnas ojsd(dasdksdas)asdklhasdas dsd。 isdjasdsdpoojs asdasdasdasdsad 46564 iasdonsoi sdjosd kjlsdk kkpnasd项目12345879não-existenteda lista 14 sdasdnsd jdspka 2564 sadasds。'

预期输出: '12345879'

3 个答案:

答案 0 :(得分:2)

这是您问题的正则表达式:

REGEXP_SUBSTR('<your string>', '\item ([0-9]*?) \n', 1, 1, null, 1)

用法:

  • *?匹配前面的模式零次或多次出现。
  • ()用于将表达式作为子表达式分组。
  • [0-9]匹配任意数字。

查询实际数据并输出:

SELECT
    REGEXP_SUBSTR('Somdasdas dasd sdaisdjas asod dasdhjs 1564, dasdohndsdias sdasdasdasdasds, ddissd ksdnas skid as 5645 sdnaslndas, ndsadn ndasknd dnsd: sdas 5465 asdasd dnaskldnas ojsd (dasdksdas) asdklhasdas dsd. isdjasdsdpoojs asdasdasdasdsad 46564 iasdonsoi sdjosd kjlsdk kkpnasd item 12345879 não-existente da lista 14 sdasdnsd jdspka 2564 sadasds'
    , '\item ([0-9]*?) \n', 1, 1, null, 1) as MY_STRING
FROM
    DUAL;


Output:

MY_STRIN
--------
12345879

db<>fiddle demo

干杯!

答案 1 :(得分:0)

假设您一直在寻找2个字符串之间嵌入的单个数字

 regexp_substr('item 123456789 n','[^0-9]+([0-9]+)[^0-9]+',1,1,null,1)
                               --^anything    ^1 or more  first match^
                               -- other than a       digits
                               -- digit occurring 
                               -- one or more times.

DEMO

答案 2 :(得分:0)

在处理正则表达式时,我倾向于尝试使事情变得过于复杂。在这种情况下,简单的解决方案是

REGEXP_SUBSTR('item 123456789 n', '[0-9]+')

dbfiddle here