【发布时间】:2020-04-23 12:30:29
【问题描述】:
从某种意义上说,我已经回答了自己的问题,但我正在努力更好地理解答案:
当使用 regexp_substr(在 oracle 中)提取第一次出现的数字(单个或多个数字)时,修饰符 * 和 + 如何/为什么会影响结果?为什么+ 提供我正在寻找的行为而* 没有? * 是我在大多数正则表达式中的默认用法,所以我很惊讶它不适合我的需要。
例如,在下面:
select test,
regexp_substr(TEST,'\d') Pattern1,
regexp_substr(TEST,'\d*') Pattern2,
regexp_substr(TEST,'\d+') Pattern3
from (
select '123 W' TEST from dual
union
select 'W 123' TEST from dual
);
regexp_substr(TEST,'\d*') 的使用为输入“W 123”返回空值 - 因为字符串中存在“零个或多个”数字,我对这种行为感到困惑。我也很困惑为什么它确实适用于字符串 '123 W'
我的理解是,* 表示它后面的元素出现零次或多次,+ 表示前面元素出现 1 次或多次。在为 pattern2 [\d*] 提供的示例中,为什么它成功地从“123 W”捕获“123”,但它没有从“W 123”中获取 123,因为确实存在零个或多个数字,它们只是不存在在字符串的开头。使用* 是否附加了额外的[隐含]逻辑?
注意:我环顾了一会,试图找到帮助我从“W 123”中捕获“123”的类似问题,但我发现最接近的是 regexp_replace 的变体,它不能满足我的需求。
【问题讨论】:
-
这是一个非常好的问题,因为我同意你的观点,似乎
\d*将匹配字符串W 123中的123。我在使用*时遇到了类似的问题。这可能会为您提供一些见解:mariusschulz.com/blog/…