2017-03-17 65 views
-2

我想用一個字符串中的連續數字的數量替換一個精確的,這意味着我不希望它替換長數字序列的一部分。正則表達式匹配數字的精確長度

例如:

select regexp_replace('filename07_20160723', '[0-9]{2}', '') from dual 

回報

filename_ 

,但我想它返回

filename_20160723 

如何更換隻有孤'07'(有非數字字符到任何一方)?

+0

那麼,你的正則表達式匹配_any兩個digits_。可能是你的意思是在一個下劃線_之前匹配兩個數字,或者在一個阿爾法字符之後是_two數字? – mustaccio

+0

「一定數量」和「確切數額」 - 你能告訴我們他們是什麼嗎?或者它們是可變的(如果是這樣,你如何將它們與「查詢」進行通信?) – mathguy

回答

0

因爲Oracle不支持一下變通,以取代準確 2位數(不包括數字兩側),捕捉非數字的兩側,並把它們放回去:

regexp_replace('filename07_20160723', '(\D)\d\d(\D)', '\1\2') 

注意:由於@mathguypoints out,消費的是任何一方的非數字字符,因此它們不能參與另一個匹配。這有以下影響:

x33y44z -> xy44z not xyz 

因爲'y'不能再次參與,允許在第二位對匹配。

+0

非常感謝,這正是我所問的,我只是想確保我理解你做了什麼:究竟是什麼([^ 0-9])呢?此外,它似乎沒有'\ 1 \ 2'也是如此。提前致謝! – DUzvalok

+0

如果我理解正確,可以用(\ D)替換([^ 0-9])?仍然有點困惑'\ 1 \ 2' – DUzvalok

+0

該要求仍不明確,但這種解決方案不可能工作的任何一種方式,正是由於你給的原因。 REGEXP_REPLACE將取代所有的事件,但由於「環顧四周」的問題,它不會是所有的事件。此解決方案將採用'a00bc00d'並返回'abcd',但需要'a00b00d'並返回'ab00d'。無論需求是什麼,OP都不太可能希望獲得這些結果。 – mathguy