我想用一个字符串中的连续数字的数量替换一个精确的,这意味着我不希望它替换长数字序列的一部分。正则表达式匹配数字的精确长度
例如:
select regexp_replace('filename07_20160723', '[0-9]{2}', '') from dual
回报
filename_
,但我想它返回
filename_20160723
如何更换只有孤'07'
(有非数字字符到任何一方)?
我想用一个字符串中的连续数字的数量替换一个精确的,这意味着我不希望它替换长数字序列的一部分。正则表达式匹配数字的精确长度
例如:
select regexp_replace('filename07_20160723', '[0-9]{2}', '') from dual
回报
filename_
,但我想它返回
filename_20160723
如何更换只有孤'07'
(有非数字字符到任何一方)?
因为Oracle不支持一下变通,以取代准确 2位数(不包括数字两侧),捕捉非数字的两侧,并把它们放回去:
regexp_replace('filename07_20160723', '(\D)\d\d(\D)', '\1\2')
注意:由于@mathguypoints out,消费的是任何一方的非数字字符,因此它们不能参与另一个匹配。这有以下影响:
x33y44z -> xy44z not xyz
因为'y'
不能再次参与,允许在第二位对匹配。
非常感谢,这正是我所问的,我只是想确保我理解你做了什么:究竟是什么([^ 0-9])呢?此外,它似乎没有'\ 1 \ 2'也是如此。提前致谢! – DUzvalok
如果我理解正确,可以用(\ D)替换([^ 0-9])?仍然有点困惑'\ 1 \ 2' – DUzvalok
该要求仍不明确,但这种解决方案不可能工作的任何一种方式,正是由于你给的原因。 REGEXP_REPLACE将取代所有的事件,但由于“环顾四周”的问题,它不会是所有的事件。此解决方案将采用'a00bc00d'并返回'abcd',但需要'a00b00d'并返回'ab00d'。无论需求是什么,OP都不太可能希望获得这些结果。 – mathguy
那么,你的正则表达式匹配_any两个digits_。可能是你的意思是在一个下划线_之前匹配两个数字,或者在一个阿尔法字符之后是_two数字? – mustaccio
“一定数量”和“确切数额” - 你能告诉我们他们是什么吗?或者它们是可变的(如果是这样,你如何将它们与“查询”进行通信?) – mathguy