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

ham*_*mdi 8 regex sql 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
Run Code Online (Sandbox Code Playgroud)

输出: a b c (x, y, z) a (xx, yy, zz) x

但我想反过来说.只需,从内部移除此角色()并留在外面.

输出: a, b, c (x y z), a, (xx yy zz), x,

bw_*_*ezi 3

这适用于括号中参数长度恒定的情况。

REGEXP_REPLACE(t.col1, '(\(.*?),(.*?),(.*?\))', '\1\2\3') new_col
Run Code Online (Sandbox Code Playgroud)

更新受到@Kobi评论的启发:
这个正则表达式删除了第一个,可选的第二个和可选的第三个,它,之间()
可以扩展到9个(我有一本书指出 \1 ... \500 应该是可能的,但只有 \1 .. .\9 有效)

REGEXP_REPLACE(t.col1, '\(([^,]*),([^,]*),?([^,]*),?([^,]*)\)', '(\1\2\3\4)') new_col
Run Code Online (Sandbox Code Playgroud)

  • @hamdi,您可以扩展此处显示的正则表达式,以在括号之间使用 4 个元素运行,以支持最多 9 个元素。对于处理无限数量的元素,SQL 可能不是合适的工具。更通用的正则表达式可以通过 Oracle 不支持的“look around”功能来实现。 (2认同)