Oracle заменить запятую, но только если после пробела нет - PullRequest
1 голос
/ 28 мая 2020

Я нахожу примеры для других языков, но я действительно не понимаю регулярных выражений, поэтому их трудно преобразовать в синтаксис Oracle.

Я думаю, что хочу использовать REGEXP_REPLACE, и я хочу чтобы заменить запятую на da sh, но только если после запятой нет пробела. Так, например:

ДЕРЕВО, ВИДЫ ДЕРЕВА, КЛЕН

заменит первую запятую, но не вторую:

ТАБЛИЦА ВИДЫ ДЕРЕВО, КЛЕН

Я могу сделать простой REGEXP_REPLACE, но только противоположный тому, что я хочу:

REGEXP_REPLACE(FieldToChange, ', ', '-')

Это то же самое, что и прямое ЗАМЕНИТЬ, которое Я понимаю.

REGEXP_REPLACE(FieldToChange, ',[^ ]', '-')

Это захватывает только запятую, после которой нет пробела, но также принимает следующий символ, в результате чего получается:

ТАБЛИЦА ДЕРЕВО -ТРИ ВИДА, КЛЕН

Я читаю Oracle документы, но, как и во многих других документах, вам нужно кое-что понять, прежде чем они обретут смысл. Поэтому мне бы очень хотелось объяснения, а не простого ответа. (Другие ответы, которые я нашел для других языков, просто дают ответ, который не помогает мне преобразовать это в Oracle.)

1 Ответ

3 голосов
/ 28 мая 2020

Ваше регулярное выражение в REGEXP_REPLACE(FieldToChange, ',[^ ]', '-') соответствует запятой с , и любому символу, кроме пробела, с выражением в скобках с отрицанием [^ ]. Соответствующий текст заменяется -, вашим шаблоном замены.

В регулярном выражении позиция, за которой не следует какой-либо другой шаблон, обычно сопоставляется (или «утверждается») с помощью отрицательного просмотра вперед (например, (?! )). Однако механизм регулярных выражений Oracle основан на POSIX и не поддерживает поисковые запросы.

Здесь вы можете положиться на механизм захвата :

REGEXP_REPLACE(FieldToChange, ',([^ ])', '-\1')

Теперь, ([^ ]) захватывает любой символ, кроме пробела, в Группу 1, и вы можете ссылаться на значение в группе с помощью \1 в шаблоне замены. \1 - это числовая обратная ссылка c. У вас может быть до 9 групп в вашем шаблоне, POSIX \1 -подобные pbackreferences не допускают большего (от 1 до 9).

Если вы хотите также сопоставить запятую в конце строки, вам необходимо использовать чередование в группе:

REGEXP_REPLACE(FieldToChange, ',([^ ]|$)', '-\1')

Группа захвата ([^ ]|$) соответствует любому символу, кроме пробела или конца строки. Вы не можете использовать [^ $], потому что $ теряет значение привязки конца строки внутри выражения в скобках, а [^ $] соответствует любому символу, кроме символа пробела и доллара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...