sapbuddy-dsh 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +12 -4
- package/defaults/AGENTS.md +114 -114
- package/defaults/connections.example.json +21 -21
- package/defaults/prompts/Memory.md +21 -21
- package/defaults/prompts/SYSTEM.md +110 -110
- package/defaults/settings.example.json +3 -3
- package/dist/sap-tools/adtManager.d.ts +11 -1
- package/dist/sap-tools/adtManager.js +176 -9
- package/dist/sap-tools/connections-store.js +4 -1
- package/dist/sap-tools/execution.js +1 -1
- package/dist/tools.js +5 -3
- package/package.json +5 -3
- package/skills/abap-code-review/SKILL.md +75 -75
- package/skills/abap-code-review/assets/report-template.html +142 -142
- package/skills/abap-code-review/references/checklist.md +114 -114
- package/skills/abap-explain/SKILL.md +126 -126
- package/skills/abap-templates/SKILL.md +764 -764
- package/skills/abap-wiki/SKILL.md +104 -104
- package/skills/clean-abap/SKILL.md +91 -91
- package/skills/clean-abap/references/CleanABAP_zh.md +4309 -4309
- package/skills/dev-write/SKILL.md +137 -137
- package/skills/sap-abap-skills/README.md +205 -205
- package/skills/sap-abap-skills/SKILL.md +498 -498
- package/skills/sap-abap-skills/references/abap-dictionary.md +211 -211
- package/skills/sap-abap-skills/references/abap-sql.md +588 -588
- package/skills/sap-abap-skills/references/amdp.md +279 -279
- package/skills/sap-abap-skills/references/authorization.md +149 -149
- package/skills/sap-abap-skills/references/bits-bytes.md +92 -92
- package/skills/sap-abap-skills/references/builtin-functions.md +373 -373
- package/skills/sap-abap-skills/references/cds-views.md +412 -412
- package/skills/sap-abap-skills/references/cloud-development.md +299 -299
- package/skills/sap-abap-skills/references/constructor-expressions.md +458 -458
- package/skills/sap-abap-skills/references/date-time.md +415 -415
- package/skills/sap-abap-skills/references/design-patterns.md +292 -292
- package/skills/sap-abap-skills/references/dynamic-programming.md +426 -426
- package/skills/sap-abap-skills/references/exceptions.md +432 -432
- package/skills/sap-abap-skills/references/generative-ai.md +180 -180
- package/skills/sap-abap-skills/references/internal-tables.md +578 -578
- package/skills/sap-abap-skills/references/numeric-operations.md +219 -219
- package/skills/sap-abap-skills/references/object-orientation.md +518 -518
- package/skills/sap-abap-skills/references/performance.md +428 -428
- package/skills/sap-abap-skills/references/program-flow.md +302 -302
- package/skills/sap-abap-skills/references/rap-eml.md +549 -549
- package/skills/sap-abap-skills/references/released-classes.md +308 -308
- package/skills/sap-abap-skills/references/sap-luw.md +203 -203
- package/skills/sap-abap-skills/references/skill-reference-guide.md +98 -98
- package/skills/sap-abap-skills/references/sql-hierarchies.md +180 -180
- package/skills/sap-abap-skills/references/string-processing.md +488 -488
- package/skills/sap-abap-skills/references/table-grouping.md +150 -150
- package/skills/sap-abap-skills/references/tool-guide.md +285 -285
- package/skills/sap-abap-skills/references/unit-testing.md +512 -512
- package/skills/sap-abap-skills/references/where-conditions.md +223 -223
- package/skills/sap-abap-skills/references/xml-json.md +315 -315
- package/skills/translate-workflow/SKILL.md +69 -69
|
@@ -1,488 +1,488 @@
|
|
|
1
|
-
# ABAP String Processing - Complete Reference
|
|
2
|
-
|
|
3
|
-
**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/07_String_Processing.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/07_String_Processing.md)
|
|
4
|
-
|
|
5
|
-
> **Version Note**: `FINAL(...)` requires **7.50+** — use `DATA(...)` on 7.40.
|
|
6
|
-
> All string functions and templates are available from 7.40 SP02+.
|
|
7
|
-
|
|
8
|
-
## Table of Contents
|
|
9
|
-
|
|
10
|
-
1. [String Data Types](#string-data-types)
|
|
11
|
-
2. [String Templates](#string-templates)
|
|
12
|
-
3. [String Functions](#string-functions)
|
|
13
|
-
4. [FIND and REPLACE](#find-and-replace)
|
|
14
|
-
5. [Regular Expressions](#regular-expressions)
|
|
15
|
-
6. [Split and Concatenate](#split-and-concatenate)
|
|
16
|
-
7. [Case Conversion](#case-conversion)
|
|
17
|
-
8. [Numeric String Operations](#numeric-string-operations)
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## String Data Types
|
|
22
|
-
|
|
23
|
-
| Type | Description | Length | Initial Value |
|
|
24
|
-
|------|-------------|--------|---------------|
|
|
25
|
-
| `string` | Variable-length text | Dynamic (up to 2GB) | Empty string |
|
|
26
|
-
| `c` | Fixed-length text | 1-262,143 chars | Blanks |
|
|
27
|
-
| `n` | Numeric characters | Digits 0-9 only | Zeros |
|
|
28
|
-
| `d` | Date field | 8 chars (YYYYMMDD) | '00000000' |
|
|
29
|
-
| `t` | Time field | 6 chars (HHMMSS) | '000000' |
|
|
30
|
-
| `x` | Fixed-length bytes | Raw byte data | Hex zeros |
|
|
31
|
-
| `xstring` | Variable-length bytes | Dynamic | Empty |
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Declaration and Literals
|
|
36
|
-
|
|
37
|
-
```abap
|
|
38
|
-
" String declaration
|
|
39
|
-
DATA str TYPE string.
|
|
40
|
-
DATA str VALUE `initial value`.
|
|
41
|
-
DATA(inline_str) = `Hello`.
|
|
42
|
-
FINAL(immutable) = `constant`.
|
|
43
|
-
|
|
44
|
-
" Fixed-length character
|
|
45
|
-
DATA char TYPE c LENGTH 10.
|
|
46
|
-
DATA char(10) TYPE c VALUE 'fixed text'.
|
|
47
|
-
|
|
48
|
-
" Literals
|
|
49
|
-
DATA(text_field) = 'single quotes'. " Type c, trailing blanks trimmed
|
|
50
|
-
DATA(text_string) = `backquotes`. " Type string, blanks preserved
|
|
51
|
-
|
|
52
|
-
" Escape backquote in string
|
|
53
|
-
DATA(escaped) = `This is a backquote: ``.`.
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## String Templates
|
|
59
|
-
|
|
60
|
-
```abap
|
|
61
|
-
" Basic syntax with pipes and curly braces
|
|
62
|
-
DATA(msg) = |Hello { name }!|.
|
|
63
|
-
DATA(result) = |Value: { value }, Status: { status }|.
|
|
64
|
-
|
|
65
|
-
" Control characters
|
|
66
|
-
DATA(multiline) = |Line 1\nLine 2\nLine 3|.
|
|
67
|
-
DATA(tabbed) = |Col1\tCol2\tCol3|.
|
|
68
|
-
|
|
69
|
-
" Escape special characters with backslash
|
|
70
|
-
DATA(special) = |Pipe: \|, Backslash: \\, Brace: \{|.
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### Formatting Options
|
|
74
|
-
|
|
75
|
-
```abap
|
|
76
|
-
" Date formatting
|
|
77
|
-
DATA(date_iso) = |{ sy-datum DATE = ISO }|. " 2024-01-15
|
|
78
|
-
DATA(date_user) = |{ sy-datum DATE = USER }|. " Per user settings
|
|
79
|
-
|
|
80
|
-
" Time formatting
|
|
81
|
-
DATA(time_iso) = |{ sy-uzeit TIME = ISO }|. " 14:30:00
|
|
82
|
-
|
|
83
|
-
" Case transformation
|
|
84
|
-
DATA(upper) = |{ text CASE = UPPER }|.
|
|
85
|
-
DATA(lower) = |{ text CASE = LOWER }|.
|
|
86
|
-
|
|
87
|
-
" Width and alignment
|
|
88
|
-
DATA(left) = |{ text WIDTH = 20 ALIGN = LEFT }|.
|
|
89
|
-
DATA(right) = |{ text WIDTH = 20 ALIGN = RIGHT }|.
|
|
90
|
-
DATA(center) = |{ text WIDTH = 20 ALIGN = CENTER }|.
|
|
91
|
-
|
|
92
|
-
" Padding
|
|
93
|
-
DATA(padded) = |{ num WIDTH = 10 PAD = '0' }|.
|
|
94
|
-
|
|
95
|
-
" Number formatting
|
|
96
|
-
DATA(decimals) = |{ amount DECIMALS = 2 }|.
|
|
97
|
-
DATA(sign) = |{ amount SIGN = LEFT }|.
|
|
98
|
-
DATA(no_zero) = |{ 0 ZERO = NO }|. " Empty if zero
|
|
99
|
-
|
|
100
|
-
" Alpha conversion (leading zeros)
|
|
101
|
-
DATA(with_zeros) = |{ '1234' ALPHA = IN WIDTH = 10 }|. " 0000001234
|
|
102
|
-
DATA(no_zeros) = |{ '00001234' ALPHA = OUT }|. " 1234
|
|
103
|
-
|
|
104
|
-
" Scientific notation
|
|
105
|
-
DATA(scientific) = |{ number STYLE = SCIENTIFIC }|.
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
## String Length
|
|
111
|
-
|
|
112
|
-
```abap
|
|
113
|
-
" strlen - includes trailing blanks for string, not for c
|
|
114
|
-
DATA(len_c) = strlen( 'abc ' ). " 3
|
|
115
|
-
DATA(len_str) = strlen( `abc ` ). " 6
|
|
116
|
-
|
|
117
|
-
" numofchar - excludes trailing blanks for all types
|
|
118
|
-
DATA(chars_c) = numofchar( 'abc ' ). " 3
|
|
119
|
-
DATA(chars_str) = numofchar( `abc ` ). " 3
|
|
120
|
-
|
|
121
|
-
" xstrlen - byte length for byte strings
|
|
122
|
-
DATA(bytes) = xstrlen( xstr ).
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## Concatenation
|
|
128
|
-
|
|
129
|
-
```abap
|
|
130
|
-
" && operator
|
|
131
|
-
DATA(full) = first && ` ` && last.
|
|
132
|
-
DATA(url) = `https://` && domain && `/` && path.
|
|
133
|
-
|
|
134
|
-
" &&= assignment operator
|
|
135
|
-
text &&= ` additional`.
|
|
136
|
-
|
|
137
|
-
" CONCATENATE statement
|
|
138
|
-
CONCATENATE str1 str2 INTO result.
|
|
139
|
-
CONCATENATE str1 str2 str3 INTO result SEPARATED BY `,`.
|
|
140
|
-
CONCATENATE 'a ' 'b ' 'c ' INTO result RESPECTING BLANKS.
|
|
141
|
-
|
|
142
|
-
" Concatenate table lines
|
|
143
|
-
CONCATENATE LINES OF itab INTO result.
|
|
144
|
-
CONCATENATE LINES OF itab INTO result SEPARATED BY `,`.
|
|
145
|
-
|
|
146
|
-
" concat_lines_of function
|
|
147
|
-
DATA(joined) = concat_lines_of( table = itab ).
|
|
148
|
-
DATA(joined_sep) = concat_lines_of( table = itab sep = `, ` ).
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## Splitting
|
|
154
|
-
|
|
155
|
-
```abap
|
|
156
|
-
" SPLIT into variables
|
|
157
|
-
SPLIT text AT `,` INTO part1 part2 part3.
|
|
158
|
-
|
|
159
|
-
" SPLIT into table
|
|
160
|
-
SPLIT text AT `,` INTO TABLE itab.
|
|
161
|
-
|
|
162
|
-
" segment function - get specific part
|
|
163
|
-
DATA(second) = segment( val = text index = 2 sep = `,` ).
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## Case Transformation
|
|
169
|
-
|
|
170
|
-
```abap
|
|
171
|
-
" String functions (return new string)
|
|
172
|
-
DATA(upper_text) = to_upper( text ).
|
|
173
|
-
DATA(lower_text) = to_lower( text ).
|
|
174
|
-
|
|
175
|
-
" TRANSLATE statement (modifies source)
|
|
176
|
-
TRANSLATE text TO UPPER CASE.
|
|
177
|
-
TRANSLATE text TO LOWER CASE.
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
---
|
|
181
|
-
|
|
182
|
-
## Shifting and Condensing
|
|
183
|
-
|
|
184
|
-
```abap
|
|
185
|
-
" SHIFT statement
|
|
186
|
-
SHIFT text. " 1 place left
|
|
187
|
-
SHIFT text BY 3 PLACES LEFT.
|
|
188
|
-
SHIFT text BY 3 PLACES RIGHT.
|
|
189
|
-
SHIFT text BY 3 PLACES LEFT CIRCULAR. " Wrap around
|
|
190
|
-
SHIFT text UP TO 'abc'. " Shift to substring
|
|
191
|
-
SHIFT text LEFT DELETING LEADING ` `.
|
|
192
|
-
SHIFT text RIGHT DELETING TRAILING ` `.
|
|
193
|
-
|
|
194
|
-
" shift_left/shift_right functions
|
|
195
|
-
DATA(shifted) = shift_left( val = text places = 3 ).
|
|
196
|
-
DATA(shifted) = shift_left( val = text circular = 2 ).
|
|
197
|
-
DATA(shifted) = shift_right( val = text sub = ` ` ).
|
|
198
|
-
|
|
199
|
-
" CONDENSE statement
|
|
200
|
-
CONDENSE text. " Remove leading/trailing, compress
|
|
201
|
-
CONDENSE text NO-GAPS. " Remove all blanks
|
|
202
|
-
|
|
203
|
-
" condense function
|
|
204
|
-
DATA(condensed) = condense( text ).
|
|
205
|
-
DATA(condensed) = condense( val = text to = `` ). " No-gaps effect
|
|
206
|
-
DATA(condensed) = condense( val = text del = `#` from = `x` to = `y` ).
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## Substring Operations
|
|
212
|
-
|
|
213
|
-
```abap
|
|
214
|
-
" substring function
|
|
215
|
-
DATA(sub) = substring( val = text off = 5 ). " From position 5 to end
|
|
216
|
-
DATA(sub) = substring( val = text len = 3 ). " First 3 chars
|
|
217
|
-
DATA(sub) = substring( val = text off = 5 len = 3 ). " 3 chars from position 5
|
|
218
|
-
|
|
219
|
-
" Direct offset/length notation
|
|
220
|
-
DATA(first5) = text(5).
|
|
221
|
-
DATA(from3) = text+3.
|
|
222
|
-
DATA(from3_len5) = text+3(5).
|
|
223
|
-
DATA(rest) = text+5(*). " * = rest of string
|
|
224
|
-
|
|
225
|
-
" Modify substring
|
|
226
|
-
text(5) = 'Hello'.
|
|
227
|
-
text+3(3) = '###'.
|
|
228
|
-
|
|
229
|
-
" Advanced substring functions
|
|
230
|
-
DATA(after) = substring_after( val = text sub = `prefix` ).
|
|
231
|
-
DATA(before) = substring_before( val = text sub = `suffix` ).
|
|
232
|
-
DATA(from) = substring_from( val = text sub = `start` ).
|
|
233
|
-
DATA(to) = substring_to( val = text sub = `end` ).
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
---
|
|
237
|
-
|
|
238
|
-
## Finding Substrings
|
|
239
|
-
|
|
240
|
-
### find Function
|
|
241
|
-
|
|
242
|
-
```abap
|
|
243
|
-
" Basic search (returns offset or -1)
|
|
244
|
-
DATA(pos) = find( val = text sub = `search` ).
|
|
245
|
-
|
|
246
|
-
" Case-insensitive
|
|
247
|
-
DATA(pos) = find( val = text sub = `SEARCH` case = abap_false ).
|
|
248
|
-
|
|
249
|
-
" Occurrence (1 = first, 2 = second, -1 = last)
|
|
250
|
-
DATA(pos) = find( val = text sub = `x` occ = 2 ).
|
|
251
|
-
DATA(pos) = find( val = text sub = `x` occ = -1 ). " From right
|
|
252
|
-
|
|
253
|
-
" With offset and length
|
|
254
|
-
DATA(pos) = find( val = text sub = `x` off = 5 len = 10 ).
|
|
255
|
-
|
|
256
|
-
" Find end position
|
|
257
|
-
DATA(end_pos) = find_end( val = text sub = `search` ).
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
### FIND Statement
|
|
261
|
-
|
|
262
|
-
```abap
|
|
263
|
-
" Basic find
|
|
264
|
-
FIND 'pattern' IN text.
|
|
265
|
-
IF sy-subrc = 0.
|
|
266
|
-
" Found
|
|
267
|
-
ENDIF.
|
|
268
|
-
|
|
269
|
-
" With result information
|
|
270
|
-
FIND FIRST OCCURRENCE OF `pattern` IN text
|
|
271
|
-
MATCH COUNT DATA(count)
|
|
272
|
-
MATCH OFFSET DATA(offset)
|
|
273
|
-
MATCH LENGTH DATA(length).
|
|
274
|
-
|
|
275
|
-
" All occurrences
|
|
276
|
-
FIND ALL OCCURRENCES OF `pattern` IN text
|
|
277
|
-
MATCH COUNT DATA(total_count)
|
|
278
|
-
RESULTS DATA(match_results).
|
|
279
|
-
|
|
280
|
-
" With section
|
|
281
|
-
FIND ALL OCCURRENCES OF `x` IN SECTION OFFSET 5 LENGTH 20 OF text
|
|
282
|
-
MATCH COUNT DATA(cnt).
|
|
283
|
-
|
|
284
|
-
" Case sensitivity
|
|
285
|
-
FIND `ABC` IN text IGNORING CASE MATCH OFFSET DATA(off).
|
|
286
|
-
FIND `ABC` IN text RESPECTING CASE MATCH OFFSET DATA(off).
|
|
287
|
-
|
|
288
|
-
" Regular expression
|
|
289
|
-
FIND FIRST OCCURRENCE OF PCRE `\d+` IN text
|
|
290
|
-
MATCH OFFSET DATA(num_offset)
|
|
291
|
-
MATCH LENGTH DATA(num_length).
|
|
292
|
-
|
|
293
|
-
" In table
|
|
294
|
-
FIND ALL OCCURRENCES OF `pattern` IN TABLE itab
|
|
295
|
-
RESULTS DATA(table_results).
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
---
|
|
299
|
-
|
|
300
|
-
## Character Set Operations
|
|
301
|
-
|
|
302
|
-
### Comparison Operators
|
|
303
|
-
|
|
304
|
-
```abap
|
|
305
|
-
" CA - Contains Any
|
|
306
|
-
IF text CA 'aeiou'. " Contains any vowel
|
|
307
|
-
DATA(pos) = sy-fdpos. " Position of first match
|
|
308
|
-
ENDIF.
|
|
309
|
-
|
|
310
|
-
" NA - Not Contains Any (negation of CA)
|
|
311
|
-
IF text NA 'xyz'.
|
|
312
|
-
" Contains none of x, y, z
|
|
313
|
-
ENDIF.
|
|
314
|
-
|
|
315
|
-
" CO - Contains Only
|
|
316
|
-
IF text CO '0123456789'. " Only digits
|
|
317
|
-
ENDIF.
|
|
318
|
-
|
|
319
|
-
" CN - Contains Not Only
|
|
320
|
-
IF text CN 'abc'. " Contains other than a, b, c
|
|
321
|
-
ENDIF.
|
|
322
|
-
|
|
323
|
-
" CS - Contains String
|
|
324
|
-
IF text CS 'pattern'. " Case-insensitive substring
|
|
325
|
-
ENDIF.
|
|
326
|
-
|
|
327
|
-
" NS - Not Contains String
|
|
328
|
-
IF text NS 'pattern'.
|
|
329
|
-
ENDIF.
|
|
330
|
-
|
|
331
|
-
" CP - Conforms to Pattern
|
|
332
|
-
IF text CP '*test*'. " * = any chars, + = single char
|
|
333
|
-
ENDIF.
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
### Character Functions
|
|
337
|
-
|
|
338
|
-
```abap
|
|
339
|
-
" find_any_of - offset of first occurrence of any character
|
|
340
|
-
DATA(pos) = find_any_of( val = text sub = `aeiou` ).
|
|
341
|
-
|
|
342
|
-
" find_any_not_of - offset of first char not in set
|
|
343
|
-
DATA(pos) = find_any_not_of( val = text sub = `0123456789` ).
|
|
344
|
-
|
|
345
|
-
" count - occurrences of substring
|
|
346
|
-
DATA(cnt) = count( val = text sub = `a` ).
|
|
347
|
-
|
|
348
|
-
" count_any_of - occurrences of any character in set
|
|
349
|
-
DATA(cnt) = count_any_of( val = text sub = `aeiou` ).
|
|
350
|
-
|
|
351
|
-
" count_any_not_of - occurrences of chars not in set
|
|
352
|
-
DATA(cnt) = count_any_not_of( val = text sub = `aeiou` ).
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
---
|
|
356
|
-
|
|
357
|
-
## Replacing
|
|
358
|
-
|
|
359
|
-
### replace Function
|
|
360
|
-
|
|
361
|
-
```abap
|
|
362
|
-
" First occurrence
|
|
363
|
-
DATA(result) = replace( val = text sub = `old` with = `new` ).
|
|
364
|
-
|
|
365
|
-
" All occurrences (occ = 0)
|
|
366
|
-
DATA(result) = replace( val = text sub = `old` with = `new` occ = 0 ).
|
|
367
|
-
|
|
368
|
-
" Specific occurrence
|
|
369
|
-
DATA(result) = replace( val = text sub = `x` with = `y` occ = 2 ).
|
|
370
|
-
|
|
371
|
-
" From right (negative occ)
|
|
372
|
-
DATA(result) = replace( val = text sub = `x` with = `y` occ = -1 ).
|
|
373
|
-
|
|
374
|
-
" Case-insensitive
|
|
375
|
-
DATA(result) = replace( val = text sub = `OLD` with = `new` case = abap_false ).
|
|
376
|
-
|
|
377
|
-
" Position-based (when sub not specified)
|
|
378
|
-
DATA(result) = replace( val = text with = `new` off = 5 len = 3 ).
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
### REPLACE Statement
|
|
382
|
-
|
|
383
|
-
```abap
|
|
384
|
-
" First occurrence
|
|
385
|
-
REPLACE 'old' IN text WITH 'new'.
|
|
386
|
-
|
|
387
|
-
" All occurrences
|
|
388
|
-
REPLACE ALL OCCURRENCES OF 'old' IN text WITH 'new'.
|
|
389
|
-
|
|
390
|
-
" With results
|
|
391
|
-
REPLACE ALL OCCURRENCES OF 'old' IN text WITH 'new'
|
|
392
|
-
REPLACEMENT COUNT DATA(count)
|
|
393
|
-
REPLACEMENT OFFSET DATA(offset)
|
|
394
|
-
REPLACEMENT LENGTH DATA(length)
|
|
395
|
-
RESULTS DATA(results).
|
|
396
|
-
|
|
397
|
-
" Case-insensitive
|
|
398
|
-
REPLACE ALL OCCURRENCES OF 'OLD' IN text WITH 'new' IGNORING CASE.
|
|
399
|
-
|
|
400
|
-
" Section replacement
|
|
401
|
-
REPLACE SECTION OFFSET 5 LENGTH 3 OF text WITH 'new'.
|
|
402
|
-
|
|
403
|
-
" In table
|
|
404
|
-
REPLACE ALL OCCURRENCES OF 'old' IN TABLE itab WITH 'new'.
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
### translate Function
|
|
408
|
-
|
|
409
|
-
```abap
|
|
410
|
-
" Character-by-character replacement
|
|
411
|
-
DATA(result) = translate( val = text from = `abc` to = `xyz` ).
|
|
412
|
-
" a->x, b->y, c->z
|
|
413
|
-
|
|
414
|
-
" TRANSLATE statement
|
|
415
|
-
TRANSLATE text USING 'axbycz'. " Pairs: a->x, b->y, c->z
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
---
|
|
419
|
-
|
|
420
|
-
## Regular Expressions
|
|
421
|
-
|
|
422
|
-
```abap
|
|
423
|
-
" FIND with PCRE
|
|
424
|
-
FIND FIRST OCCURRENCE OF PCRE `\d{3}-\d{4}` IN text
|
|
425
|
-
MATCH OFFSET DATA(off)
|
|
426
|
-
MATCH LENGTH DATA(len).
|
|
427
|
-
|
|
428
|
-
FIND ALL OCCURRENCES OF PCRE `[a-z]+` IN text
|
|
429
|
-
RESULTS DATA(matches).
|
|
430
|
-
|
|
431
|
-
" REPLACE with PCRE
|
|
432
|
-
REPLACE ALL OCCURRENCES OF PCRE `\s+` IN text WITH ` `.
|
|
433
|
-
|
|
434
|
-
" Backreferences
|
|
435
|
-
REPLACE ALL OCCURRENCES OF PCRE `(\w+)\s+\1` IN text WITH `$1`.
|
|
436
|
-
|
|
437
|
-
" String functions with PCRE
|
|
438
|
-
DATA(pos) = find( val = text pcre = `\d+` ).
|
|
439
|
-
DATA(result) = replace( val = text pcre = `\s+` with = `-` occ = 0 ).
|
|
440
|
-
DATA(matched) = match( val = text pcre = `[A-Z]+` ).
|
|
441
|
-
|
|
442
|
-
" Class-based approach
|
|
443
|
-
DATA(regex) = cl_abap_regex=>create_pcre( pattern = `\d+` ).
|
|
444
|
-
DATA(matcher) = regex->create_matcher( text = text ).
|
|
445
|
-
DATA(results) = matcher->find_all( ).
|
|
446
|
-
```
|
|
447
|
-
|
|
448
|
-
---
|
|
449
|
-
|
|
450
|
-
## Other String Functions
|
|
451
|
-
|
|
452
|
-
```abap
|
|
453
|
-
" Reverse
|
|
454
|
-
DATA(reversed) = reverse( text ).
|
|
455
|
-
|
|
456
|
-
" Insert
|
|
457
|
-
DATA(result) = insert( val = text sub = `new` off = 5 ).
|
|
458
|
-
|
|
459
|
-
" Repeat
|
|
460
|
-
DATA(repeated) = repeat( val = `abc` occ = 3 ). " abcabcabc
|
|
461
|
-
|
|
462
|
-
" String comparison (min/max)
|
|
463
|
-
DATA(smallest) = cmin( val1 = str1 val2 = str2 val3 = str3 ).
|
|
464
|
-
DATA(biggest) = cmax( val1 = str1 val2 = str2 val3 = str3 ).
|
|
465
|
-
|
|
466
|
-
" Levenshtein distance
|
|
467
|
-
DATA(dist) = distance( val1 = `abap` val2 = `abac` ).
|
|
468
|
-
|
|
469
|
-
" Escape special characters
|
|
470
|
-
DATA(escaped) = escape( val = text format = cl_abap_format=>e_url_full ).
|
|
471
|
-
DATA(json_safe) = escape( val = text format = cl_abap_format=>e_json_string ).
|
|
472
|
-
DATA(template_safe) = escape( val = text format = cl_abap_format=>e_string_tpl ).
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
---
|
|
476
|
-
|
|
477
|
-
## Utility Classes
|
|
478
|
-
|
|
479
|
-
```abap
|
|
480
|
-
" CL_ABAP_STRING_UTILITIES
|
|
481
|
-
cl_abap_string_utilities=>del_trailing_blanks( CHANGING str = text ).
|
|
482
|
-
text = cl_abap_string_utilities=>c2str_preserving_blanks( char ).
|
|
483
|
-
|
|
484
|
-
" CL_ABAP_CHAR_UTILITIES
|
|
485
|
-
DATA(cr) = cl_abap_char_utilities=>cr_lf.
|
|
486
|
-
DATA(tab) = cl_abap_char_utilities=>horizontal_tab.
|
|
487
|
-
DATA(newline) = cl_abap_char_utilities=>newline.
|
|
488
|
-
```
|
|
1
|
+
# ABAP String Processing - Complete Reference
|
|
2
|
+
|
|
3
|
+
**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/07_String_Processing.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/07_String_Processing.md)
|
|
4
|
+
|
|
5
|
+
> **Version Note**: `FINAL(...)` requires **7.50+** — use `DATA(...)` on 7.40.
|
|
6
|
+
> All string functions and templates are available from 7.40 SP02+.
|
|
7
|
+
|
|
8
|
+
## Table of Contents
|
|
9
|
+
|
|
10
|
+
1. [String Data Types](#string-data-types)
|
|
11
|
+
2. [String Templates](#string-templates)
|
|
12
|
+
3. [String Functions](#string-functions)
|
|
13
|
+
4. [FIND and REPLACE](#find-and-replace)
|
|
14
|
+
5. [Regular Expressions](#regular-expressions)
|
|
15
|
+
6. [Split and Concatenate](#split-and-concatenate)
|
|
16
|
+
7. [Case Conversion](#case-conversion)
|
|
17
|
+
8. [Numeric String Operations](#numeric-string-operations)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## String Data Types
|
|
22
|
+
|
|
23
|
+
| Type | Description | Length | Initial Value |
|
|
24
|
+
|------|-------------|--------|---------------|
|
|
25
|
+
| `string` | Variable-length text | Dynamic (up to 2GB) | Empty string |
|
|
26
|
+
| `c` | Fixed-length text | 1-262,143 chars | Blanks |
|
|
27
|
+
| `n` | Numeric characters | Digits 0-9 only | Zeros |
|
|
28
|
+
| `d` | Date field | 8 chars (YYYYMMDD) | '00000000' |
|
|
29
|
+
| `t` | Time field | 6 chars (HHMMSS) | '000000' |
|
|
30
|
+
| `x` | Fixed-length bytes | Raw byte data | Hex zeros |
|
|
31
|
+
| `xstring` | Variable-length bytes | Dynamic | Empty |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Declaration and Literals
|
|
36
|
+
|
|
37
|
+
```abap
|
|
38
|
+
" String declaration
|
|
39
|
+
DATA str TYPE string.
|
|
40
|
+
DATA str VALUE `initial value`.
|
|
41
|
+
DATA(inline_str) = `Hello`.
|
|
42
|
+
FINAL(immutable) = `constant`.
|
|
43
|
+
|
|
44
|
+
" Fixed-length character
|
|
45
|
+
DATA char TYPE c LENGTH 10.
|
|
46
|
+
DATA char(10) TYPE c VALUE 'fixed text'.
|
|
47
|
+
|
|
48
|
+
" Literals
|
|
49
|
+
DATA(text_field) = 'single quotes'. " Type c, trailing blanks trimmed
|
|
50
|
+
DATA(text_string) = `backquotes`. " Type string, blanks preserved
|
|
51
|
+
|
|
52
|
+
" Escape backquote in string
|
|
53
|
+
DATA(escaped) = `This is a backquote: ``.`.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## String Templates
|
|
59
|
+
|
|
60
|
+
```abap
|
|
61
|
+
" Basic syntax with pipes and curly braces
|
|
62
|
+
DATA(msg) = |Hello { name }!|.
|
|
63
|
+
DATA(result) = |Value: { value }, Status: { status }|.
|
|
64
|
+
|
|
65
|
+
" Control characters
|
|
66
|
+
DATA(multiline) = |Line 1\nLine 2\nLine 3|.
|
|
67
|
+
DATA(tabbed) = |Col1\tCol2\tCol3|.
|
|
68
|
+
|
|
69
|
+
" Escape special characters with backslash
|
|
70
|
+
DATA(special) = |Pipe: \|, Backslash: \\, Brace: \{|.
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Formatting Options
|
|
74
|
+
|
|
75
|
+
```abap
|
|
76
|
+
" Date formatting
|
|
77
|
+
DATA(date_iso) = |{ sy-datum DATE = ISO }|. " 2024-01-15
|
|
78
|
+
DATA(date_user) = |{ sy-datum DATE = USER }|. " Per user settings
|
|
79
|
+
|
|
80
|
+
" Time formatting
|
|
81
|
+
DATA(time_iso) = |{ sy-uzeit TIME = ISO }|. " 14:30:00
|
|
82
|
+
|
|
83
|
+
" Case transformation
|
|
84
|
+
DATA(upper) = |{ text CASE = UPPER }|.
|
|
85
|
+
DATA(lower) = |{ text CASE = LOWER }|.
|
|
86
|
+
|
|
87
|
+
" Width and alignment
|
|
88
|
+
DATA(left) = |{ text WIDTH = 20 ALIGN = LEFT }|.
|
|
89
|
+
DATA(right) = |{ text WIDTH = 20 ALIGN = RIGHT }|.
|
|
90
|
+
DATA(center) = |{ text WIDTH = 20 ALIGN = CENTER }|.
|
|
91
|
+
|
|
92
|
+
" Padding
|
|
93
|
+
DATA(padded) = |{ num WIDTH = 10 PAD = '0' }|.
|
|
94
|
+
|
|
95
|
+
" Number formatting
|
|
96
|
+
DATA(decimals) = |{ amount DECIMALS = 2 }|.
|
|
97
|
+
DATA(sign) = |{ amount SIGN = LEFT }|.
|
|
98
|
+
DATA(no_zero) = |{ 0 ZERO = NO }|. " Empty if zero
|
|
99
|
+
|
|
100
|
+
" Alpha conversion (leading zeros)
|
|
101
|
+
DATA(with_zeros) = |{ '1234' ALPHA = IN WIDTH = 10 }|. " 0000001234
|
|
102
|
+
DATA(no_zeros) = |{ '00001234' ALPHA = OUT }|. " 1234
|
|
103
|
+
|
|
104
|
+
" Scientific notation
|
|
105
|
+
DATA(scientific) = |{ number STYLE = SCIENTIFIC }|.
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## String Length
|
|
111
|
+
|
|
112
|
+
```abap
|
|
113
|
+
" strlen - includes trailing blanks for string, not for c
|
|
114
|
+
DATA(len_c) = strlen( 'abc ' ). " 3
|
|
115
|
+
DATA(len_str) = strlen( `abc ` ). " 6
|
|
116
|
+
|
|
117
|
+
" numofchar - excludes trailing blanks for all types
|
|
118
|
+
DATA(chars_c) = numofchar( 'abc ' ). " 3
|
|
119
|
+
DATA(chars_str) = numofchar( `abc ` ). " 3
|
|
120
|
+
|
|
121
|
+
" xstrlen - byte length for byte strings
|
|
122
|
+
DATA(bytes) = xstrlen( xstr ).
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Concatenation
|
|
128
|
+
|
|
129
|
+
```abap
|
|
130
|
+
" && operator
|
|
131
|
+
DATA(full) = first && ` ` && last.
|
|
132
|
+
DATA(url) = `https://` && domain && `/` && path.
|
|
133
|
+
|
|
134
|
+
" &&= assignment operator
|
|
135
|
+
text &&= ` additional`.
|
|
136
|
+
|
|
137
|
+
" CONCATENATE statement
|
|
138
|
+
CONCATENATE str1 str2 INTO result.
|
|
139
|
+
CONCATENATE str1 str2 str3 INTO result SEPARATED BY `,`.
|
|
140
|
+
CONCATENATE 'a ' 'b ' 'c ' INTO result RESPECTING BLANKS.
|
|
141
|
+
|
|
142
|
+
" Concatenate table lines
|
|
143
|
+
CONCATENATE LINES OF itab INTO result.
|
|
144
|
+
CONCATENATE LINES OF itab INTO result SEPARATED BY `,`.
|
|
145
|
+
|
|
146
|
+
" concat_lines_of function
|
|
147
|
+
DATA(joined) = concat_lines_of( table = itab ).
|
|
148
|
+
DATA(joined_sep) = concat_lines_of( table = itab sep = `, ` ).
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Splitting
|
|
154
|
+
|
|
155
|
+
```abap
|
|
156
|
+
" SPLIT into variables
|
|
157
|
+
SPLIT text AT `,` INTO part1 part2 part3.
|
|
158
|
+
|
|
159
|
+
" SPLIT into table
|
|
160
|
+
SPLIT text AT `,` INTO TABLE itab.
|
|
161
|
+
|
|
162
|
+
" segment function - get specific part
|
|
163
|
+
DATA(second) = segment( val = text index = 2 sep = `,` ).
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Case Transformation
|
|
169
|
+
|
|
170
|
+
```abap
|
|
171
|
+
" String functions (return new string)
|
|
172
|
+
DATA(upper_text) = to_upper( text ).
|
|
173
|
+
DATA(lower_text) = to_lower( text ).
|
|
174
|
+
|
|
175
|
+
" TRANSLATE statement (modifies source)
|
|
176
|
+
TRANSLATE text TO UPPER CASE.
|
|
177
|
+
TRANSLATE text TO LOWER CASE.
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Shifting and Condensing
|
|
183
|
+
|
|
184
|
+
```abap
|
|
185
|
+
" SHIFT statement
|
|
186
|
+
SHIFT text. " 1 place left
|
|
187
|
+
SHIFT text BY 3 PLACES LEFT.
|
|
188
|
+
SHIFT text BY 3 PLACES RIGHT.
|
|
189
|
+
SHIFT text BY 3 PLACES LEFT CIRCULAR. " Wrap around
|
|
190
|
+
SHIFT text UP TO 'abc'. " Shift to substring
|
|
191
|
+
SHIFT text LEFT DELETING LEADING ` `.
|
|
192
|
+
SHIFT text RIGHT DELETING TRAILING ` `.
|
|
193
|
+
|
|
194
|
+
" shift_left/shift_right functions
|
|
195
|
+
DATA(shifted) = shift_left( val = text places = 3 ).
|
|
196
|
+
DATA(shifted) = shift_left( val = text circular = 2 ).
|
|
197
|
+
DATA(shifted) = shift_right( val = text sub = ` ` ).
|
|
198
|
+
|
|
199
|
+
" CONDENSE statement
|
|
200
|
+
CONDENSE text. " Remove leading/trailing, compress
|
|
201
|
+
CONDENSE text NO-GAPS. " Remove all blanks
|
|
202
|
+
|
|
203
|
+
" condense function
|
|
204
|
+
DATA(condensed) = condense( text ).
|
|
205
|
+
DATA(condensed) = condense( val = text to = `` ). " No-gaps effect
|
|
206
|
+
DATA(condensed) = condense( val = text del = `#` from = `x` to = `y` ).
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Substring Operations
|
|
212
|
+
|
|
213
|
+
```abap
|
|
214
|
+
" substring function
|
|
215
|
+
DATA(sub) = substring( val = text off = 5 ). " From position 5 to end
|
|
216
|
+
DATA(sub) = substring( val = text len = 3 ). " First 3 chars
|
|
217
|
+
DATA(sub) = substring( val = text off = 5 len = 3 ). " 3 chars from position 5
|
|
218
|
+
|
|
219
|
+
" Direct offset/length notation
|
|
220
|
+
DATA(first5) = text(5).
|
|
221
|
+
DATA(from3) = text+3.
|
|
222
|
+
DATA(from3_len5) = text+3(5).
|
|
223
|
+
DATA(rest) = text+5(*). " * = rest of string
|
|
224
|
+
|
|
225
|
+
" Modify substring
|
|
226
|
+
text(5) = 'Hello'.
|
|
227
|
+
text+3(3) = '###'.
|
|
228
|
+
|
|
229
|
+
" Advanced substring functions
|
|
230
|
+
DATA(after) = substring_after( val = text sub = `prefix` ).
|
|
231
|
+
DATA(before) = substring_before( val = text sub = `suffix` ).
|
|
232
|
+
DATA(from) = substring_from( val = text sub = `start` ).
|
|
233
|
+
DATA(to) = substring_to( val = text sub = `end` ).
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Finding Substrings
|
|
239
|
+
|
|
240
|
+
### find Function
|
|
241
|
+
|
|
242
|
+
```abap
|
|
243
|
+
" Basic search (returns offset or -1)
|
|
244
|
+
DATA(pos) = find( val = text sub = `search` ).
|
|
245
|
+
|
|
246
|
+
" Case-insensitive
|
|
247
|
+
DATA(pos) = find( val = text sub = `SEARCH` case = abap_false ).
|
|
248
|
+
|
|
249
|
+
" Occurrence (1 = first, 2 = second, -1 = last)
|
|
250
|
+
DATA(pos) = find( val = text sub = `x` occ = 2 ).
|
|
251
|
+
DATA(pos) = find( val = text sub = `x` occ = -1 ). " From right
|
|
252
|
+
|
|
253
|
+
" With offset and length
|
|
254
|
+
DATA(pos) = find( val = text sub = `x` off = 5 len = 10 ).
|
|
255
|
+
|
|
256
|
+
" Find end position
|
|
257
|
+
DATA(end_pos) = find_end( val = text sub = `search` ).
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### FIND Statement
|
|
261
|
+
|
|
262
|
+
```abap
|
|
263
|
+
" Basic find
|
|
264
|
+
FIND 'pattern' IN text.
|
|
265
|
+
IF sy-subrc = 0.
|
|
266
|
+
" Found
|
|
267
|
+
ENDIF.
|
|
268
|
+
|
|
269
|
+
" With result information
|
|
270
|
+
FIND FIRST OCCURRENCE OF `pattern` IN text
|
|
271
|
+
MATCH COUNT DATA(count)
|
|
272
|
+
MATCH OFFSET DATA(offset)
|
|
273
|
+
MATCH LENGTH DATA(length).
|
|
274
|
+
|
|
275
|
+
" All occurrences
|
|
276
|
+
FIND ALL OCCURRENCES OF `pattern` IN text
|
|
277
|
+
MATCH COUNT DATA(total_count)
|
|
278
|
+
RESULTS DATA(match_results).
|
|
279
|
+
|
|
280
|
+
" With section
|
|
281
|
+
FIND ALL OCCURRENCES OF `x` IN SECTION OFFSET 5 LENGTH 20 OF text
|
|
282
|
+
MATCH COUNT DATA(cnt).
|
|
283
|
+
|
|
284
|
+
" Case sensitivity
|
|
285
|
+
FIND `ABC` IN text IGNORING CASE MATCH OFFSET DATA(off).
|
|
286
|
+
FIND `ABC` IN text RESPECTING CASE MATCH OFFSET DATA(off).
|
|
287
|
+
|
|
288
|
+
" Regular expression
|
|
289
|
+
FIND FIRST OCCURRENCE OF PCRE `\d+` IN text
|
|
290
|
+
MATCH OFFSET DATA(num_offset)
|
|
291
|
+
MATCH LENGTH DATA(num_length).
|
|
292
|
+
|
|
293
|
+
" In table
|
|
294
|
+
FIND ALL OCCURRENCES OF `pattern` IN TABLE itab
|
|
295
|
+
RESULTS DATA(table_results).
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Character Set Operations
|
|
301
|
+
|
|
302
|
+
### Comparison Operators
|
|
303
|
+
|
|
304
|
+
```abap
|
|
305
|
+
" CA - Contains Any
|
|
306
|
+
IF text CA 'aeiou'. " Contains any vowel
|
|
307
|
+
DATA(pos) = sy-fdpos. " Position of first match
|
|
308
|
+
ENDIF.
|
|
309
|
+
|
|
310
|
+
" NA - Not Contains Any (negation of CA)
|
|
311
|
+
IF text NA 'xyz'.
|
|
312
|
+
" Contains none of x, y, z
|
|
313
|
+
ENDIF.
|
|
314
|
+
|
|
315
|
+
" CO - Contains Only
|
|
316
|
+
IF text CO '0123456789'. " Only digits
|
|
317
|
+
ENDIF.
|
|
318
|
+
|
|
319
|
+
" CN - Contains Not Only
|
|
320
|
+
IF text CN 'abc'. " Contains other than a, b, c
|
|
321
|
+
ENDIF.
|
|
322
|
+
|
|
323
|
+
" CS - Contains String
|
|
324
|
+
IF text CS 'pattern'. " Case-insensitive substring
|
|
325
|
+
ENDIF.
|
|
326
|
+
|
|
327
|
+
" NS - Not Contains String
|
|
328
|
+
IF text NS 'pattern'.
|
|
329
|
+
ENDIF.
|
|
330
|
+
|
|
331
|
+
" CP - Conforms to Pattern
|
|
332
|
+
IF text CP '*test*'. " * = any chars, + = single char
|
|
333
|
+
ENDIF.
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Character Functions
|
|
337
|
+
|
|
338
|
+
```abap
|
|
339
|
+
" find_any_of - offset of first occurrence of any character
|
|
340
|
+
DATA(pos) = find_any_of( val = text sub = `aeiou` ).
|
|
341
|
+
|
|
342
|
+
" find_any_not_of - offset of first char not in set
|
|
343
|
+
DATA(pos) = find_any_not_of( val = text sub = `0123456789` ).
|
|
344
|
+
|
|
345
|
+
" count - occurrences of substring
|
|
346
|
+
DATA(cnt) = count( val = text sub = `a` ).
|
|
347
|
+
|
|
348
|
+
" count_any_of - occurrences of any character in set
|
|
349
|
+
DATA(cnt) = count_any_of( val = text sub = `aeiou` ).
|
|
350
|
+
|
|
351
|
+
" count_any_not_of - occurrences of chars not in set
|
|
352
|
+
DATA(cnt) = count_any_not_of( val = text sub = `aeiou` ).
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## Replacing
|
|
358
|
+
|
|
359
|
+
### replace Function
|
|
360
|
+
|
|
361
|
+
```abap
|
|
362
|
+
" First occurrence
|
|
363
|
+
DATA(result) = replace( val = text sub = `old` with = `new` ).
|
|
364
|
+
|
|
365
|
+
" All occurrences (occ = 0)
|
|
366
|
+
DATA(result) = replace( val = text sub = `old` with = `new` occ = 0 ).
|
|
367
|
+
|
|
368
|
+
" Specific occurrence
|
|
369
|
+
DATA(result) = replace( val = text sub = `x` with = `y` occ = 2 ).
|
|
370
|
+
|
|
371
|
+
" From right (negative occ)
|
|
372
|
+
DATA(result) = replace( val = text sub = `x` with = `y` occ = -1 ).
|
|
373
|
+
|
|
374
|
+
" Case-insensitive
|
|
375
|
+
DATA(result) = replace( val = text sub = `OLD` with = `new` case = abap_false ).
|
|
376
|
+
|
|
377
|
+
" Position-based (when sub not specified)
|
|
378
|
+
DATA(result) = replace( val = text with = `new` off = 5 len = 3 ).
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### REPLACE Statement
|
|
382
|
+
|
|
383
|
+
```abap
|
|
384
|
+
" First occurrence
|
|
385
|
+
REPLACE 'old' IN text WITH 'new'.
|
|
386
|
+
|
|
387
|
+
" All occurrences
|
|
388
|
+
REPLACE ALL OCCURRENCES OF 'old' IN text WITH 'new'.
|
|
389
|
+
|
|
390
|
+
" With results
|
|
391
|
+
REPLACE ALL OCCURRENCES OF 'old' IN text WITH 'new'
|
|
392
|
+
REPLACEMENT COUNT DATA(count)
|
|
393
|
+
REPLACEMENT OFFSET DATA(offset)
|
|
394
|
+
REPLACEMENT LENGTH DATA(length)
|
|
395
|
+
RESULTS DATA(results).
|
|
396
|
+
|
|
397
|
+
" Case-insensitive
|
|
398
|
+
REPLACE ALL OCCURRENCES OF 'OLD' IN text WITH 'new' IGNORING CASE.
|
|
399
|
+
|
|
400
|
+
" Section replacement
|
|
401
|
+
REPLACE SECTION OFFSET 5 LENGTH 3 OF text WITH 'new'.
|
|
402
|
+
|
|
403
|
+
" In table
|
|
404
|
+
REPLACE ALL OCCURRENCES OF 'old' IN TABLE itab WITH 'new'.
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### translate Function
|
|
408
|
+
|
|
409
|
+
```abap
|
|
410
|
+
" Character-by-character replacement
|
|
411
|
+
DATA(result) = translate( val = text from = `abc` to = `xyz` ).
|
|
412
|
+
" a->x, b->y, c->z
|
|
413
|
+
|
|
414
|
+
" TRANSLATE statement
|
|
415
|
+
TRANSLATE text USING 'axbycz'. " Pairs: a->x, b->y, c->z
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
## Regular Expressions
|
|
421
|
+
|
|
422
|
+
```abap
|
|
423
|
+
" FIND with PCRE
|
|
424
|
+
FIND FIRST OCCURRENCE OF PCRE `\d{3}-\d{4}` IN text
|
|
425
|
+
MATCH OFFSET DATA(off)
|
|
426
|
+
MATCH LENGTH DATA(len).
|
|
427
|
+
|
|
428
|
+
FIND ALL OCCURRENCES OF PCRE `[a-z]+` IN text
|
|
429
|
+
RESULTS DATA(matches).
|
|
430
|
+
|
|
431
|
+
" REPLACE with PCRE
|
|
432
|
+
REPLACE ALL OCCURRENCES OF PCRE `\s+` IN text WITH ` `.
|
|
433
|
+
|
|
434
|
+
" Backreferences
|
|
435
|
+
REPLACE ALL OCCURRENCES OF PCRE `(\w+)\s+\1` IN text WITH `$1`.
|
|
436
|
+
|
|
437
|
+
" String functions with PCRE
|
|
438
|
+
DATA(pos) = find( val = text pcre = `\d+` ).
|
|
439
|
+
DATA(result) = replace( val = text pcre = `\s+` with = `-` occ = 0 ).
|
|
440
|
+
DATA(matched) = match( val = text pcre = `[A-Z]+` ).
|
|
441
|
+
|
|
442
|
+
" Class-based approach
|
|
443
|
+
DATA(regex) = cl_abap_regex=>create_pcre( pattern = `\d+` ).
|
|
444
|
+
DATA(matcher) = regex->create_matcher( text = text ).
|
|
445
|
+
DATA(results) = matcher->find_all( ).
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## Other String Functions
|
|
451
|
+
|
|
452
|
+
```abap
|
|
453
|
+
" Reverse
|
|
454
|
+
DATA(reversed) = reverse( text ).
|
|
455
|
+
|
|
456
|
+
" Insert
|
|
457
|
+
DATA(result) = insert( val = text sub = `new` off = 5 ).
|
|
458
|
+
|
|
459
|
+
" Repeat
|
|
460
|
+
DATA(repeated) = repeat( val = `abc` occ = 3 ). " abcabcabc
|
|
461
|
+
|
|
462
|
+
" String comparison (min/max)
|
|
463
|
+
DATA(smallest) = cmin( val1 = str1 val2 = str2 val3 = str3 ).
|
|
464
|
+
DATA(biggest) = cmax( val1 = str1 val2 = str2 val3 = str3 ).
|
|
465
|
+
|
|
466
|
+
" Levenshtein distance
|
|
467
|
+
DATA(dist) = distance( val1 = `abap` val2 = `abac` ).
|
|
468
|
+
|
|
469
|
+
" Escape special characters
|
|
470
|
+
DATA(escaped) = escape( val = text format = cl_abap_format=>e_url_full ).
|
|
471
|
+
DATA(json_safe) = escape( val = text format = cl_abap_format=>e_json_string ).
|
|
472
|
+
DATA(template_safe) = escape( val = text format = cl_abap_format=>e_string_tpl ).
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## Utility Classes
|
|
478
|
+
|
|
479
|
+
```abap
|
|
480
|
+
" CL_ABAP_STRING_UTILITIES
|
|
481
|
+
cl_abap_string_utilities=>del_trailing_blanks( CHANGING str = text ).
|
|
482
|
+
text = cl_abap_string_utilities=>c2str_preserving_blanks( char ).
|
|
483
|
+
|
|
484
|
+
" CL_ABAP_CHAR_UTILITIES
|
|
485
|
+
DATA(cr) = cl_abap_char_utilities=>cr_lf.
|
|
486
|
+
DATA(tab) = cl_abap_char_utilities=>horizontal_tab.
|
|
487
|
+
DATA(newline) = cl_abap_char_utilities=>newline.
|
|
488
|
+
```
|