#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/12. Спасибо за это. За пределами 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'