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.
Files changed (55) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +12 -4
  3. package/defaults/AGENTS.md +114 -114
  4. package/defaults/connections.example.json +21 -21
  5. package/defaults/prompts/Memory.md +21 -21
  6. package/defaults/prompts/SYSTEM.md +110 -110
  7. package/defaults/settings.example.json +3 -3
  8. package/dist/sap-tools/adtManager.d.ts +11 -1
  9. package/dist/sap-tools/adtManager.js +176 -9
  10. package/dist/sap-tools/connections-store.js +4 -1
  11. package/dist/sap-tools/execution.js +1 -1
  12. package/dist/tools.js +5 -3
  13. package/package.json +5 -3
  14. package/skills/abap-code-review/SKILL.md +75 -75
  15. package/skills/abap-code-review/assets/report-template.html +142 -142
  16. package/skills/abap-code-review/references/checklist.md +114 -114
  17. package/skills/abap-explain/SKILL.md +126 -126
  18. package/skills/abap-templates/SKILL.md +764 -764
  19. package/skills/abap-wiki/SKILL.md +104 -104
  20. package/skills/clean-abap/SKILL.md +91 -91
  21. package/skills/clean-abap/references/CleanABAP_zh.md +4309 -4309
  22. package/skills/dev-write/SKILL.md +137 -137
  23. package/skills/sap-abap-skills/README.md +205 -205
  24. package/skills/sap-abap-skills/SKILL.md +498 -498
  25. package/skills/sap-abap-skills/references/abap-dictionary.md +211 -211
  26. package/skills/sap-abap-skills/references/abap-sql.md +588 -588
  27. package/skills/sap-abap-skills/references/amdp.md +279 -279
  28. package/skills/sap-abap-skills/references/authorization.md +149 -149
  29. package/skills/sap-abap-skills/references/bits-bytes.md +92 -92
  30. package/skills/sap-abap-skills/references/builtin-functions.md +373 -373
  31. package/skills/sap-abap-skills/references/cds-views.md +412 -412
  32. package/skills/sap-abap-skills/references/cloud-development.md +299 -299
  33. package/skills/sap-abap-skills/references/constructor-expressions.md +458 -458
  34. package/skills/sap-abap-skills/references/date-time.md +415 -415
  35. package/skills/sap-abap-skills/references/design-patterns.md +292 -292
  36. package/skills/sap-abap-skills/references/dynamic-programming.md +426 -426
  37. package/skills/sap-abap-skills/references/exceptions.md +432 -432
  38. package/skills/sap-abap-skills/references/generative-ai.md +180 -180
  39. package/skills/sap-abap-skills/references/internal-tables.md +578 -578
  40. package/skills/sap-abap-skills/references/numeric-operations.md +219 -219
  41. package/skills/sap-abap-skills/references/object-orientation.md +518 -518
  42. package/skills/sap-abap-skills/references/performance.md +428 -428
  43. package/skills/sap-abap-skills/references/program-flow.md +302 -302
  44. package/skills/sap-abap-skills/references/rap-eml.md +549 -549
  45. package/skills/sap-abap-skills/references/released-classes.md +308 -308
  46. package/skills/sap-abap-skills/references/sap-luw.md +203 -203
  47. package/skills/sap-abap-skills/references/skill-reference-guide.md +98 -98
  48. package/skills/sap-abap-skills/references/sql-hierarchies.md +180 -180
  49. package/skills/sap-abap-skills/references/string-processing.md +488 -488
  50. package/skills/sap-abap-skills/references/table-grouping.md +150 -150
  51. package/skills/sap-abap-skills/references/tool-guide.md +285 -285
  52. package/skills/sap-abap-skills/references/unit-testing.md +512 -512
  53. package/skills/sap-abap-skills/references/where-conditions.md +223 -223
  54. package/skills/sap-abap-skills/references/xml-json.md +315 -315
  55. 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
+ ```