Oracle正则表达式替换为不消耗字符的负前瞻/后瞻

时间:2016-02-03 01:00:59

标签: regex oracle regex-lookarounds

我正在寻找一个更好的答案来解决一个非常类似的问题到“负面前瞻/后瞻的Oracle正则表达替换”

我的问题是在关键字后面找到正好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被建议作为现有帖子中的解决方案,作为避免的方式。*?匹配9的第1位数字,但如果没有非数字,则无效。 (在REF12345678中,已使用REF中的F。)


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

在Perl中运行得非常好,而不是Oracle,它不支持负面的后视。

如何在数字之前出现非数字,或者。*没有以数字结尾?如何进行零宽度断言? (使用\ D?将无效。)

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

I think this is what you're looking for:

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

This says, if there are any characters between REF and the eight digits, the last one must be a non-digit.