Регулярное выражение находит и заменяет игнорирование совпадений частей

#sql #regex #oracle #regexp-replace #regexp-like

#sql #регулярное выражение #Oracle #регулярное выражение-заменить #подобное регулярному выражению

Вопрос:

У меня есть строка, отформатированная как:

 '(val$1,val$1,val$1,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)'
  

и то, что я пытаюсь сделать, это заменить val$1 некоторым текстом, например XYZ

Сопоставление просто val$1 приводит:

 '(XYZ,XYZ,XYZ,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,XYZ0,XYZ1,XYZ2)'
  

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

 '(XYZ,XYZ,XYZ,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)'
  

Комментарии:

1.Что-то вроде bval$1b regex101.com/r/7bO9ar/1

2. Спасибо за это. За пределами Oracle это выглядит неплохо, поскольку я использую их REGEXP_REPLACE, а b не поддерживается. Есть ли другой способ обойти это?

3. Я с этим не знаком. Вы должны добавить эти соответствующие теги к вопросу, чтобы охватить правильную аудиторию 🙂

4. хорошо, приветствия (и добавлены теги)

5. Если границы слов не поддерживаются, вы можете попробовать val$1(,|)) Это сопоставляет только подстроки с , или ) после val$1

Ответ №1:

Вы можете добавить дополнительную цифру D к шаблону для regexp_replace

 select regexp_replace('(val$1,val$1,val$1,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,
                        val$10,val$11,val$12)','val$1(D)','XYZ1') as "Result"
  from dual;

Result
----------------------------------------------------------------------------------
(XYZ,XYZ,XYZ,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)
  

Комментарии:

1. @dunkyduncs и Barbaros. Это ставит дополнительную запятую в конце, если в конце есть val$1 , то есть непосредственно перед ) . Попробуйте REGEXP_REPLACE(string, ','val$1(D)','XYZ1') вместо

2. ..или даже лучше [^0-9a-zA-Z] вместо D

3. @KaushikNayak да, ваше решение более обобщенное и лучшее, спасибо. В зависимости от моего, я предпочел первое.

4. Спасибо. Что делают скобки в этом экземпляре val $ 1([^0-9a-zA-Z])

5. @dunkyduncs добро пожаловать, да, это тоже работает. Но я думаю, что нет необходимости включать все эти элементы шаблона подробно.

Ответ №2:

Вам действительно нужны регулярные выражения для этого? Похоже, простая задача для старой доброй REPLACE функции. Если вам приходится иметь дело с большим количеством данных, регулярное выражение, вероятно, будет намного медленнее.

 SQL> select replace('(val$1,val$1,val$1,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)',
  2                 'val$1,', 'xyz,') result
  3  from dual;

RESULT
----------------------------------------------------------------------------------
(xyz,xyz,xyz,val$2,val$3,val$4,val$5,val$6,val$7,val$8,val$9,val$10,val$11,val$12)

SQL>
  

Комментарии:

1. Не желаемый набор результатов, так что да, требуется reg exp. Желаемый результат смотрите выше. Приветствия, Duncs

2. Ах! Извините, не заметил конец строки. В любом случае, REPLACE все еще выполняет свою работу. Я изменил код, который я ранее опубликовал, взгляните.

3. О какой незначительной проблеме идет речь?

Ответ №3:

Вы также можете выполнить поиск по "val$1" где за которым следует запятая или закрывающий paren (если это происходит в конце строки).

 'val$1(,|\)', 'XYZ1'