我有一些像
这样的值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
答案 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