Oracle 正则表达式似乎无法正确处理

Oracle regexp cant seem to get it right

我有一些价值观,例如

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

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

select regexp_replace('CR-123344','^((?!ECR)\w+)','ECR') from dual

我哪里出错了? 我希望结果是

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

这里不是绝对需要使用正则表达式,使用Oracle的基本字符串函数即可。

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

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

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

 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;

Results in

    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

您似乎正在用 ECR 替换“-”之前的字符。您是否需要检查它是否完全不匹配 'ECR'?

因为这会给你想要的,不是吗?

select regexp_replace('CR-123344','(.*)-','ECR-') 来自双重;