Regex 正则表达式匹配数字的精确长度

Regex 正则表达式匹配数字的精确长度,regex,oracle,regexp-replace,Regex,Oracle,Regexp Replace,我想替换字符串中精确数量的连续数字,这意味着我不想替换作为较长数字序列一部分的出现 例如: select regexp_replace('filename07_20160723', '[0-9]{2}', '') from dual 返回 filename_ 但我希望它能回来 filename_20160723 如何仅替换两边都有非数字字符的单独“07”?因为oracle不支持环顾四周,要替换两边都没有数字的两个数字,请捕获两边的非数字并将其放回: regexp_replace('file

我想替换字符串中精确数量的连续数字,这意味着我不想替换作为较长数字序列一部分的出现

例如:

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

filename_
但我希望它能回来

filename_20160723

如何仅替换两边都有非数字字符的单独“07”?

因为oracle不支持环顾四周,要替换两边都没有数字的两个数字,请捕获两边的非数字并将其放回:

regexp_replace('filename07_20160723', '(\D)\d\d(\D)', '\1\2')
注意:由于双方都使用了非数字字符,因此无法参与其他匹配。这具有以下效果:

x33y44z -> xy44z not xyz

因为“y”不能再次参与以允许在第二个数字对上进行匹配。

嗯,正则表达式匹配任意两个数字。您是要匹配下划线前的两位数字,还是字母字符后的两位数字?一定数量和确切数量-您能告诉我们它们是什么吗?或者它们是可变的,如果是,您如何将它们传达给查询?非常感谢,这正是我要问的,我只是想确保我了解您所做的事情:[^0-9]到底做了什么?而且,如果没有“\1\2”,它似乎也可以工作。这是为什么呢。提前谢谢!如果我理解正确,[^0-9]是否可以替换为\D?仍然有点被“\1\2”搞糊涂需求仍然不清楚,但是无论哪种方式,这个解决方案都不可能工作,这正是您给出的原因。REGEXP_REPLACE将替换所有事件,但由于“环顾”问题,它实际上并不是所有事件。此解决方案将采用“a00bc00d”并返回“abcd”,但将采用“a00b00d”并返回“ab00d”。无论需求是什么,OP都不太可能想要这两种结果。@DUzvalok我认为oracle不支持\d etc,但答案已更新\1\2表示组1和组2-在匹配中用括号捕获的组。@mathguy鉴于oracle太弱,无法正确支持正则表达式,这是我能想到的最好的解决方案。