我需要在下面的示例中提取第二個下劃線後面的數字,我的正則表達式僅在有兩個數字(例如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不匹配
我需要在下面的示例中提取第二個下劃線後面的數字,我的正則表達式僅在有兩個數字(例如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不匹配
您正則表達式匹配兩個或更多個連續的數字,而不管它們在字符串中的位置。這意味着它會從字符串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)
在這裏,你需要的最後一個參數只返回捕獲組。
您可以使用
SELECT REGEXP_SUBSTR('str_0_0123_3', '_[^_]*_0*([0-9]+)_', 1, 1, NULL, 1) as result from dual
詳細:
_
- 強調[^_]*
- 其他零個或多個字符比下劃線_
- 下劃線0*
- 零個或多個0
小號([0-9]+)
- 第1組:一個或多個數字_
- 下劃線最後1
參數意味着只有捕獲組內容返回。
不需要使用i
修飾符,因爲模式中沒有字母。