2017-03-17 58 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