我在oracle论坛网站上找到了一个例子:
输入字符串:a, b, c (x, y, z), a, (xx, yy, zz), x,
WITH t AS (SELECT 'a, b, c (x, y, z), a, (xx, yy, zz), x,' col1
FROM dual)
SELECT t.col1
, REGEXP_REPLACE(t.col1, '(\(.*?\))|,', '\1') new_col
FROM t
输出:a b c (x, y, z) a (xx, yy, zz) x
但我想反过来说。只需从,
内删除此字符()
,然后留在外面。
输出:a, b, c (x y z), a, (xx yy zz), x,
答案 0 :(得分:3)
这将适用于括号中常量长度的参数。
REGEXP_REPLACE(t.col1, '(\(.*?),(.*?),(.*?\))', '\1\2\3') new_col
受@ Kobi评论启发的更新:,
之间的第1个,可选的第2个和第3个()
它可以扩展到9(我有book说明\ 1 ... \ 500应该是可能的但只有\ 1 ... \ 9有效)
REGEXP_REPLACE(t.col1, '\(([^,]*),([^,]*),?([^,]*),?([^,]*)\)', '(\1\2\3\4)') new_col
答案 1 :(得分:1)
不确定REGEXP_REPLACE是否支持负面预测并查看后方,但如果确实如此,则可行:,(?<!\)[^\(]*)(?![^\)]*\()
我用C#测试:
string s = "a, b, c (x, y, z), a, (xx, yy, zz), x,";
Console.WriteLine(Regex.Replace(s, @",(?<!\)[^\(]*)(?![^\)]*\()", ""));
答案 2 :(得分:1)
您使用的正则表达式的一个小修改版本:
REGEXP_REPLACE(column_name, '((\)|^).*?(\(|$))|,', '\1')