Замена символов в строке ABAP - REPLACE

Часто при разработке программ ABAP возникает необходимость заменить подстроку другой. Функция замены поможет. Эта функция заменяет подстроку текста строкой символов и возвращает измененный текст в результате. Есть два варианта вызова, мы рассмотрим каждый из них более подробно:

Заменить часть используя смещение(off) и длину подстроки после смещения(len).

Эта опция заменяет подстроку, которую мы выбираем, используя off смещение и длина, указанная в len переменная со значением, указанным в аргументе with. С помощью этой опции вызова должен быть определен хотя бы один из этих аргументов. Примеры:

replace( val = |youcoder.ru/contacts.html| off = 12 len = 8 with = 'abap' ). 
" = youcoder.ru/abap.html

Если указан только параметр off, который аналогичен указанию параметра len = 0, тогда эта констукция будет работать как вставка.

replace( val = |youcoder/abap.html| off = 8 len = 0 with = '.ru' ). 
" = youcoder.ru/abap.html

replace( val = |youcoder/abap.html| off = 8 with = '.ru' ).
" = youcoder.ru/abap.html

Если указан только параметр len, что аналогично указанию off = 0, то первый элемент длины len будет заменен.

replace( val = |youcoder/abap.html| off = 0 len = 8 with = 'youcoder.ru' ). 
" = youcoder.ru/abap.html

replace( val = |youcoder/abap.html| len = 8 with = 'youcoder.ru' ). 
" = youcoder.ru/abap.html

Если значение параметра off равно длине строки, то значение параметра with будет вставлено в конец строки:

replace( val = |youcoder.ru| off = 11 len = 0 with = '/abap.html' ).
  " = youcoder.ru/abap.html

replace( val = |youcoder.ru| off = 11 with = '/abap.html' ). 
" = youcoder.ru/abap.html

Заменить используя подстроку(sub) или регулярное выражение(regex).

Этот параметр определения ищет определенное количество вхождений occ в строке, проверяя соответствие подстроке, указанной в substring, или регулярному выражению, указанному в аргументе regex. И заменяет эти вхождения значением, переданным в with. Если значение параметра with имеет фиксированную длину, то пробелы, указанные в конце, будут игнорироваться программой. Если вы передадите значение 0 в аргумент occ, все вхождения будут заменены. Кроме того, по умолчанию при поиске заменяемых значений учитывается регистр, но это можно изменить с помощью параметра case.

Если параметр occ не указан, то по умолчанию это будет occ = 1, и будет заменено только первое вхождение подстроки:

replace( val = |yc/index.html,yc/abap.html| sub = 'yc' with = 'youcoder.ru' ).
" = youcoder.ru/index.html,yc/abap.html

Значением по умолчанию для параметра является case = abap_true, что означает регистр символов. То есть, указав case = abap_true или пропустив этот параметр, вы получите тот же результат:

replace( val = |YC/index.html,yc/| sub = 'yc' with = 'youcoder.ru' occ = 0 ).

replace( val = |YC/index.html,yc/| sub = 'yc' with = 'youcoder.ru' case = abap_true occ = 0 ).
" = youcoder.ru/index.html,youcoder.ru/

Чтобы замена работала корректно, необходимо указать параметр case = abap_false, чтобы регистр игнорировался.

replace( val = |YC/index.html,yc/| sub = 'yc' with = 'youcoder.ru' case = abap_false occ = 0 ).
" = youcoder.ru/index.html,youcoder.ru/

Пример из реальной задачи.

При использовании масок сравнения для таблицы range и для ограничения запроса вы должны передать значение другим способом. В этом случае эту замену удобно выполнить с помощью replace с параметром regex, в который мы передаем символ, который необходимо заменить:

replace( val = '*АРМАТУРА*' regex = '\*' with = '\%' occ = 0 ).
" = %АРМАТУРА%

В результате мы получаем значение, которое можно указать для ограничения запроса в дополнении WHERE. Например: WHERE name LIKE lv_str.