Сгруппируйте повторяющийся шаблон и удалите его
Как указало revo, большой источник ваших трудностей возник из-за того, что вы не избежали периода.Кроме того, результирующая строка, включающая 115
, может быть объяснена следующим образом (Valdi_Bo ранее сделала подобное наблюдение):
([^.]+)(.[ ]*\1)+
будет соответствовать 11.15
следующим образом:
SCOTT@DB>SELECT
2 '11.15' val,
3 regexp_replace('11.15','([^.]+)(\.[ ]*\1)+','\1') deduplicated
4 FROM
5 dual;
VAL DEDUPLICATED
11.15 115
Вот аналогичный подход для решения этих проблем:
составление сопоставления с шаблоном
- поиск списка сопоставления без периодов длиной от 0 до N (подвыражениессылается на \1
).
'19 ', что соответствует ([^.]*)
-Ищите повторы, которые образуют наш второй список соответствия, связанный с подвыражением 2, на который ссылается \2
.
'19 .19.19', что соответствует ([^.]*)([.]\1)+
-Ищите точку или конец строки.Это список совпадений, на который ссылается \3
.Это исправляет совпадение «11 .15» на «115».
([.]|$)
строка замены
Я заменяю шаблон соответствия заменойСтрока, состоящая из первого экземпляра списка сопоставления без периодов.
\1\3
Решение
regexp_replace(val,'([^.]*)([.]\1)+([.]|$)','\1\3')
Вот пример использованиянекоторые варианты ваших примеров:
SCOTT@db>WITH tst AS (
2 SELECT
3 '1.1.2.2.4.4.4.5.5.9.11.15.16.16.19' val
4 FROM
5 dual
6 UNION ALL
7 SELECT
8 '1.1.1.1.2.2.4.4.4.4.4.5.5.9.11.11.11.15.16.16.19' val
9 FROM
10 dual
11 UNION ALL
12 SELECT
13 '1.1.2.2.4.4.4.5.5.9.11.15.16.16.19.19.19' val
14 FROM
15 dual
16 ) SELECT
17 val,
18 regexp_replace(val,'([^.]*)([.]\1)+([.]|$)','\1\3') deduplicate
19 FROM
20 tst;
VAL DEDUPLICATE
------------------------------------------------------------------------
1.1.2.2.4.4.4.5.5.9.11.15.16.16.19 1.2.4.5.9.11.15.16.19
1.1.1.1.2.2.4.4.4.4.4.5.5.9.11.11.11.15.16.16.19 1.2.4.5.9.11.15.16.19
1.1.2.2.4.4.4.5.5.9.11.15.16.16.19.19.19 1.2.4.5.9.11.15.16.19
Мой подход не обращается к возможным пробелам в строке.Можно просто удалить их отдельно (например, с помощью отдельного оператора замены).