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-')
来自双重;
我有一些价值观,例如
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-') 来自双重;