Oracle regexp似乎无法做到正确

时间:2017-04-14 13:33:13

标签: regex oracle11g oracle12c

我有一些像

这样的值
CR-123456
ECR-12345
BCY-499494
134-ABC
ECW-ECR1233
CR-123344

我想匹配所有不以ECR开头的行和正则表达式这样做是^((?!ECR)\ w +)这似乎做我想要的。 但后来我想要替换不以ECR开头的匹配值并用ECR替换它并且我被清空因为以下似乎没有用

  

从双

我出错的任何想法? 我希望结果是

ECR-123456
ECR-12345
ECR-499494
ECR-ABC
ECR-ECR1233
ECR-123344

2 个答案:

答案 0 :(得分:1)

你不一定非常需要在这里使用正则表达式,你可以使用Oracle的基本字符串函数。

SELECT
    'ECR-' || SUBSTR(col,
                     INSTR(col, '-') + 1,
                     LENGTH(col) - INSTR(col, '-')) AS new_col
FROM yourTable
WHERE col NOT LIKE 'ECR-%'

这种方法的优点是它可能比正则表达式运行得更快。缺点是代码不够整洁,但是如果你理解它是如何工作的那么这是最重要的事情。

答案 1 :(得分:0)

我会使用substring和instr来替换破折号之前的所有内容,但这是使用regexp的答案:

 WITH aset
     AS (SELECT 'CR-123456' a
           FROM DUAL
         UNION ALL
         SELECT 'BCY-12345' a
           FROM DUAL
         UNION ALL
         SELECT 'ECR-499494' a
           FROM DUAL
         UNION ALL
         SELECT '134-ABC' a
           FROM DUAL
         UNION ALL
         SELECT 'ECW-ECR1233' a
           FROM DUAL
         UNION ALL
         SELECT 'CR-123344'
           FROM DUAL)
SELECT a, regexp_replace(a, '^([^-]*)','ECR') b
  FROM aset;
  

结果

    A,B
CR-123456,ECR-123456
BCY-12345,ECR-12345
ECR-499494,ECR-499494
134-ABC,ECR-ABC
ECW-ECR1233,ECR-ECR1233
CR-123344,ECR-123344