2017-05-30 127 views
1

我需要在下面的示例中提取第二个下划线后面的数字,我的正则表达式仅在有两个数字(例如17)的情况下匹配字符串,当它是单个数字时不匹配。我想知道我错过了什么?REGEX_SUBSTR - 匹配第二次出现的一个或两个数字

修整(LEADING FROM REGEXP_SUBSTR(myStr的 '0', '(\ d {2,}) *',1,1, 'I', 1)))

  • 匹配的字符串str_0_17_1 - > 17匹配

  • 非匹配的字符串str_0_1_3 - > 1不匹配

回答

0

您正则表达式匹配两个或更多个连续的数字,而不管它们在字符串中的位置。这意味着它会从字符串str_123_1_3中提取12,这不是我相信的。

更改您的正则表达式匹配任何数字序列(\d+)告诉REGEXP_SUBSTR在第四个参数传递2返回正则表达式的第二次出现:

trim(LEADING '0' FROM REGEXP_SUBSTR(mystr, '\d+', 1, 2, 'i'))) 

注意,因为最后一个参数不是必需的匹配本身包含你需要的数字。

顺便说一下,您可以通过消除trim来简化整个表达式。您可提取全部使用正则表达式与捕获组排斥潜在前导零的数字:

REGEXP_SUBSTR(mystr, '0*(\d+)', 1, 2, 'i', 1) 

在这里,你需要的最后一个参数只返回捕获组。

0

您可以使用

SELECT REGEXP_SUBSTR('str_0_0123_3', '_[^_]*_0*([0-9]+)_', 1, 1, NULL, 1) as result from dual 

online demo

详细

  • _ - 强调
  • [^_]* - 其他零个或多个字符比下划线
  • _ - 下划线
  • 0* - 零个或多个0小号
  • ([0-9]+) - 第1组:一个或多个数字
  • _ - 下划线

最后1参数意味着只有捕获组内容返回。

不需要使用i修饰符,因为模式中没有字母。

相关问题