REGEXP_REPLACE - 如果包含在()中,则仅从字符串中删除逗号

时间:2011-07-26 07:39:09

标签: sql regex oracle character

我在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,

3 个答案:

答案 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')