2017-05-30 36 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修飾符,因爲模式中沒有字母。

相關問題