我需要在下面的示例中的第二个下划线之后提取数字,我的正则表达式仅在有两个数字(例如17个)时匹配字符串,但是当它是单个数字时不匹配它。我想知道我错过了什么?
修剪(LEADING' 0' FROM REGEXP_SUBSTR(mystr,' (\ d {2,}) *',1,1,&# 39; I&#39 ;, 1)))
匹配字符串str_0_17_1 - > 17匹配
非匹配字符串str_0_1_3 - > 1不匹配
答案 0 :(得分:0)
你的正则表达式匹配两个或多个连续数字,无论它们在字符串中的位置。这意味着它将从字符串12
中提取str_123_1_3
,这不是我所相信的。
更改正则表达式以匹配任何数字序列(\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)
这里需要最后一个参数才能返回捕获的组。
答案 1 :(得分:0)
您可以使用
SELECT REGEXP_SUBSTR('str_0_0123_3', '_[^_]*_0*([0-9]+)_', 1, 1, NULL, 1) as result from dual
请参阅online demo
<强>详情:
_
- 下划线[^_]*
- 除了下划线之外的零个或多个字符_
- 下划线0*
- 零个或多个0
s ([0-9]+)
- 第1组:一个或多个数字_
- 下划线最后一个1
参数表示只返回捕获组内容。
无需使用i
修饰符,因为模式中没有字母。