Замена символов в строке ABAP replaсe

Часто при разработке ABAP программ появляется необходимость заменить подстроку на другую. В этом поможет функция replase. Эта функция заменяет подстроку текста строкой символов и возвращает в качестве результата изменённый текст.
Существует два варианта вызова, рассмотрим каждый из них более подробно:

Replase с использованием аргументов off и len.

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

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

Если указан только параметр off, что аналогично указанию парамeтера 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, что аналогично указанию парамeтера 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
									

Replase с аргументами sub или regex.

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

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

	
		lv_str = 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 или пропуск этого параметра вернёт аналогичный результат:

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

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

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

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

	
		lv_str = replace( val = '*Гайка*' regex = '\*' with = '\%' occ = 0 ).
		" = %Гайка%
									

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