powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
9 сообщений из 9, страница 1 из 1
Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
    #39738730
arelsom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Прошу помочь.

Есть строка, в которой:

<DATE></DATE>
<SUM>42513,84</SUM>
<ACCOUNT> 40817810000040208061 </ACCOUNT>
<SALE>0</SALE>

Мне нужно заменить то, что между <ACCOUNT> и </ACCOUNT> (я подчеркнул).
Пробовал через регулярные выражения, но никак. Пожалуйста, объясните как правильно?

так, находил то, что надо менять:
SELECT LTRIM(SUBSTR('<DATE></DATE>
<SUM>42513,84</SUM>
<ACCOUNT>40817810000040208061</ACCOUNT>
<SALE>0</SALE>',REGEXP_INSTR('<DATE></DATE>
<SUM>42513,84</SUM>
<ACCOUNT>40817810000040208061</ACCOUNT>
<SALE>0</SALE>','<ACCOUNT>', 20), '29'), '<ACCOUNT>') SETL
from DUAL;

и через REGEXP_INSTR находил вхождение двух этих выражений, между которыми заменять надо, но дальше это не пошло.
...
Рейтинг: 0 / 0
Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
    #39738740
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arelsom,

s / <ACCOUNT>old</ACCOUNT> / <ACCOUNT>new</ACCOUNT> /
...
Рейтинг: 0 / 0
Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
    #39738754
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> 
with t(s) as(select '<DATE></DATE>
<SUM>42513,84</SUM>
<ACCOUNT>40817810000040208061</ACCOUNT>
<SALE>0</SALE>' from dual
)
select s
     , regexp_replace(s,'<ACCOUNT>[^<>]*</ACCOUNT>', '<ACCOUNT>NewAccValue</ACCOUNT>') R1
     , updatexml(xmltype('<root>'||s||'</root>'),'//ACCOUNT/text()','NewAccValue').getStringVal() R2
from t;
S                                       R1                                      R2
--------------------------------------- --------------------------------------- ---------------------------------------
<DATE></DATE>                           <DATE></DATE>                           <root><DATE/><SUM>42513,84</SUM><ACCOUN
<SUM>42513,84</SUM>                     <SUM>42513,84</SUM>                     T>NewAccValue</ACCOUNT><SALE>0</SALE></
<ACCOUNT>40817810000040208061</ACCOUNT> <ACCOUNT>NewAccValue</ACCOUNT>          root>
<SALE>0</SALE>                          <SALE>0</SALE>                          

SQL> 
...
Рейтинг: 0 / 0
Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
    #39738755
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arelsom,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (
select 
'<DATE></DATE>
<SUM>42513,84</SUM>
<ACCOUNT>40817810000040208061</ACCOUNT>
<SALE>0</SALE>' s 
  from dual
)
select s, regexp_replace (s,'<ACCOUNT>(\d+)</ACCOUNT>','<ACCOUNT>997</ACCOUNT>')
  from t;
...
Рейтинг: 0 / 0
Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
    #39738757
tenzor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
    #39738789
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
     , updatexml(xmltype('<root>'||s||'</root>'),'//ACCOUNT/text()','NewAccValue').getStringVal() R2

Создать из строки нерутед xml-значение можно с помощью xmlparse. Updatexml deprecated
...
Рейтинг: 0 / 0
Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
    #39738813
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Создать из строки нерутед xml-значение можно с помощью xmlparse.
Ага. Вылетело из головы.
-2-Updatexml deprecated
Да, к сожалению.
Эквивалентные такой тривиальной задаче XQuery проигрывают в читабельности.
...
Рейтинг: 0 / 0
Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
    #39738837
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousЭквивалентные такой тривиальной задаче XQuery проигрывают в читабельности.

А к REPLACE/REGEXP_REPLACE и то и другое жутко проигрывают в производительности. Так-что если все тэги ACCOUNT то я бы использовал REPLACE/REGEXP_REPLACE.

SY.
...
Рейтинг: 0 / 0
Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
    #39738840
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousЭквивалентные такой тривиальной задаче XQuery проигрывают в читабельности.Если оставить в стороне шелуху самого xquery (sql вообще не самый лаконичный и читабельный язык, если смотреть со стороны), то остается достаточно читабельный х-запрос:
Код: xquery
1.
2.
copy $X1 := $X0
modify (replace value of node $X1/ACCOUNT with $VAL)
return $X1
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как заменить в строке только выражение между двумя словами, остальное оставить как есть?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]