REGEXP_REPLACE - удаляйте запятые из строки ТОЛЬКО если они заключены в () - PullRequest
8 голосов
/ 26 июля 2011

Я нахожу пример на сайте форума 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 ]

3 голосов
/ 26 июля 2011

Это будет работать для постоянной длины аргументов в скобках.

REGEXP_REPLACE(t.col1, '(\(.*?),(.*?),(.*?\))', '\1\2\3') new_col

обновление, вдохновленное комментарием @ Коби:
это регулярное выражение удаляет 1-е, необязательное 2-е и необязательное 3-е , между ()
это может быть расширено до 9 (у меня есть книга , заявляющая, что \ 1 ... \ 500 должен быть возможен, но только \ 1 ... \ 9 работал)

REGEXP_REPLACE(t.col1, '\(([^,]*),([^,]*),?([^,]*),?([^,]*)\)', '(\1\2\3\4)') new_col
1 голос
/ 26 июля 2011

Немного измененная версия используемого вами регулярного выражения:

REGEXP_REPLACE(column_name, '((\)|^).*?(\(|$))|,', '\1')
1 голос
/ 26 июля 2011

Не уверен, что REGEXP_REPLACE поддерживает отрицательный взгляд вперед и назад, но если это так, это будет работать: ,(?<!\)[^\(]*)(?![^\)]*\()

Я тестировал с C #:

string s = "a, b, c (x, y, z), a, (xx, yy, zz), x,";

Console.WriteLine(Regex.Replace(s, @",(?<!\)[^\(]*)(?![^\)]*\()", ""));
...