匹配字符串中的9位数,其中包含9位以上的数字

时间:2014-12-11 16:38:52

标签: regex oracle

我有一个oracle表,其列为varchar2(4000)。我希望能够找到9个连续数字,并将其替换为xxxxxxxxx。如果连续数字超过9位,我不想替换这些数字。我试过了

regexp_replace('this is my string of digits 987654321889890','\d{9}','xxxxxxxxx')

但这会返回'this is my string of digits xxxxxxxxx889890'

在这种情况下,我希望regexp引擎忽略任何超过9个连续数字的子字符串。

提前致谢 乔伊

3 个答案:

答案 0 :(得分:2)

这应该产生预期的结果:

regexp_replace(str, '(^|[^0-9])([0-9]{9})($|[^0-9])', '\1xxxxxxxxx\3')

有关实例,请参阅http://sqlfiddle.com/#!4/d41d8/38554

答案 1 :(得分:0)

西尔万已经发布了类似的答案。

使用11.1 Oracle数据库,可以将字符分组用于替换模式。 请参阅here

与Sylvain一样,关键是创建一个由字符集封装的匹配模式,可以使用' xxxxxxxxx'来替换九个重复数字。

解决方案的步骤:

  1. 为匹配模式创建三个字符集。
  2. 使用交替运算符来说明行的开头和/或结尾而不是非数字字符的可能性。
  3. 创建替换模式:字符集1 | ' XXXXXXXXX' |字符集3。
  4. 以下是我的示例解决方案:

        SCOTT@dev> list
      1  WITH t AS
      2    (SELECT 'this is my string of digits 987654321889890' txt_val FROM dual
      3    UNION
      4    SELECT 'this is my string of digits 54321889890' FROM dual
      5    UNION
      6    SELECT 'this is my string of digits 987654321' FROM dual
      7    UNION
      8    SELECT 'this is my string of digits 98761189890' FROM dual
      9    UNION
     10    SELECT 'this is my string of digits 121889890' FROM dual
     11    )
     12  SELECT t.txt_val,
     13    regexp_replace(t.txt_val,'([^0-9]|^)(\d{9})([^0-9]|$)','\1xxxxxxxxx\3') txt_val_fixed
     14* FROM t
    SCOTT@dev> /
    
    TXT_VAL                                     TXT_VAL_FIXED
    =========================================== ================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    this is my string of digits 121889890       this is my string of digits xxxxxxxxx
    this is my string of digits 54321889890     this is my string of digits 54321889890
    this is my string of digits 98761189890     this is my string of digits 98761189890
    this is my string of digits 987654321       this is my string of digits xxxxxxxxx
    this is my string of digits 987654321889890 this is my string of digits 987654321889890
    

答案 2 :(得分:0)

感谢大家提供的有用信息。我结束了

JAM @ DEV>选择regexp_replace('987654653这是我的号码950569808890现在它不是878788976而且这个小于8823727还有一个950877665',   '(\ D | ^)(\ d {9})(\ D | $)','xxx-xx-xxxx',1,0,'m')来自双重的“regexpreplace”;

regexpreplace

xxx-xx-xxxx他是我的号码950569808890现在它不是xxx-xx-xxxx而且这个 小于8823727再多xxx-xx-xxxx