Перейти до вмісту

Обробка рядків

У ABAP два основні рядкові типи: STRING — динамічний Unicode-рядок без фіксованої довжини, і C — фіксований символьний тип із заздалегідь заданим розміром. Плюс узагальнений тип CSEQUENCE, який приймає обидва — зручно для параметрів методів.

Сучасний ABAP (7.40+) дає виразний інструментарій для роботи з рядками: string templates, inline-оголошення, вбудовані функції (strlen, to_upper, condense тощо), і повноцінна підтримка регулярних виразів. У новому коді здебільшого вистачає STRING — тип C потрібен переважно для інтерфейсів з легасі-кодом і БД.

ТипОписПриклад
STRINGДинамічний рядок, UnicodeDATA: text TYPE string.
CФіксований символьнийDATA: code TYPE c LENGTH 4.
CSEQUENCEУзагальнений (приймає STRING і C)параметр методу

STRING зберігається у heap, довжина змінюється автоматично. C — фіксована довжина, trailing spaces автоматично доповнюють короткі значення. Це джерело типових граблів при порівнянні (див. нижче).

" Класичний синтаксис
DATA: text TYPE string,
code TYPE c LENGTH 4.
" Сучасний (7.40+) — inline-оголошення
DATA(text2) = `Привіт`.

Рядкові літерали у зворотних лапках (`…`) — тип STRING. У одинарних лапках (’…’) — тип C з довжиною = кількості символів у літералі. Ця відмінність важлива для порівнянь і конкатенації.

Стара мова (до 7.40):

CONCATENATE 'Hello' ' ' 'World' INTO result.

Сучасна мова (рекомендовано):

result = |Hello World|. " string template
result = |{ a } + { b } = { a + b }|. " вбудовані вирази
result = `Hello` && ` ` && `World`. " оператор &&

String templates |...| — найпотужніший інструмент: можна вбудовувати вирази, форматувати числа/дати, керувати заповненням.

String templates завжди повертають STRING. Якщо потрібен C — використовуй CONV c( |...| ) або присвоюй у змінну типу C.

DATA(len) = strlen( text ). " довжина
DATA(trimmed) = condense( text ). " стиснути пробіли
DATA(upper) = to_upper( text ).
DATA(lower) = to_lower( text ).
DATA(rev) = reverse( text ).

strlen для C повертає значущу довжину (без trailing spaces), а не фіксовану довжину типу. Для отримання фіксованої довжини — numofchar( ).

" Пошук позиції підрядка
FIND 'SAP' IN text MATCH OFFSET DATA(off).
IF sy-subrc = 0.
" знайдено на позиції off
ENDIF.
" Заміна усіх входжень
REPLACE ALL OCCURRENCES OF 'old' IN text WITH 'new'.
" Регулярні вирази — окрема велика тема
FIND REGEX `\d+` IN text RESULTS DATA(matches).
DATA(first) = match( val = text regex = `\d+` ).

Для складних паттернів дивись Регулярні вирази.

Розбиття та обʼєднання

Section titled “Розбиття та обʼєднання”
SPLIT `a,b,c` AT `,` INTO TABLE DATA(parts).
" parts = ( 'a' ) ( 'b' ) ( 'c' )
DATA(joined) = concat_lines_of( table = parts sep = ` | ` ).
" joined = 'a | b | c'

Підрядок та заміна діапазонів

Section titled “Підрядок та заміна діапазонів”
DATA(text) = `Hello, World!`.
" Підрядок: від позиції, довжина
DATA(sub) = substring( val = text off = 7 len = 5 ). " 'World'
" Функції substring_after / before / from / to
DATA(after) = substring_after( val = text sub = `, ` ). " 'World!'
DATA(before) = substring_before( val = text sub = `,` ). " 'Hello'

Грабля: trailing spaces у типі C

Section titled “Грабля: trailing spaces у типі C”
DATA code TYPE c LENGTH 10.
code = 'AB'. " насправді 'AB ' (8 пробілів)
IF code = 'AB'. " TRUE (компаратор ігнорує trailing)
...
ENDIF.

Грабля: STRING не можна CLEAR до FIXED довжини

Section titled “Грабля: STRING не можна CLEAR до FIXED довжини”
DATA text TYPE string.
CLEAR text. " text стає порожнім рядком, довжина 0

Для STRING CLEAR і присвоєння порожнього літерала еквівалентні: text = '' або text = \“.

Адаптовано з 07_String_Processing.md (Apache 2.0). Повний перелік нюансів — в оригіналі.