不消耗字符的负 lookahead/lookbehind 的 Oracle 正则表达式替换

Oracle regular expression replacement for negative lookahead/lookbehind that doesn't consume a character

我正在寻找与 post "Oracle regular expression replacement for negative lookahead/lookbehind"

非常相似的问题的更好答案

我的问题是找到关键字后刚好 8 位的数字。


Must Match:
 REF12345678
 REF:12345678
 REF any text or short 23 num 12345678


But do NOT match:
REF 123456789
REF anything 123456789


'(REF)(.*?)(\d{8})(\W|$)'; # matches 9 digits: REF 123456789
'(REF)(.*?)\D(\d{8})(\W|$)'; # won't match REF12345678

\D 被建议作为现有 post 的解决方案,以避免 .*?匹配 9 的第一个数字,但如果没有剩余的非数字,它将不起作用。 (在 REF12345678 中,已经使用了 REF 中的 F)。


'(REF)(.*?)(?<!\d)(\d{8})(\W|$)' 

在 Perl 中工作得非常好,而不是在 Oracle 中,后者不支持负向回顾。

我如何做一个零宽度断言,即非数字出现在数字之前,或者 .* 没有以数字结尾? (使用 \D? 无效。)

有什么建议吗?

我想这就是您要找的:

(REF)(.*?\D)?(\d{8})(\W|$)

这表示,如果REF和八个数字之间有任何字符,最后一个必须是非数字。