不消耗字符的负 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
和八个数字之间有任何字符,最后一个必须是非数字。
我正在寻找与 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
和八个数字之间有任何字符,最后一个必须是非数字。