ABAP字符串处理

SPLIT拆分字符串

语法:SPLIT <str> AT <c> INTO <p1> <p2> <p3>.

将str(字符串)通过c(字符串)拆分为p1,p2,p3(多个字符串)

DATA: STR TYPE STRING,
      C TYPE STRING VALUE '*',
      C1 TYPE STRING VALUE '',
      C2 TYPE STRING VALUE '',
      C3 TYPE STRING VALUE ''.
STR = 'A*B*C*D'.
WRITE STR.        "A*B*C*D
SPLIT STR AT C INTO C1 C2 C3.
WRITE:/'C1:',C1.  "P1:A
WRITE:/'C2:',C2.  "P2:B
WRITE:/'C3:',C3.  "P3:C*D

SHIFT移动字段内容

语法:SHIFT <c> [BY <n> PLACES] [<mode>].

将字段<c>移动<n>个位置,如果 <n> 是 0 或负值,则 <c> 保持不变。 如果 <n> 超过 <c> 长度,则 <c> 用空格填充 。<n> 可为变量。

[<mode>]代表方位:

  •  LEFT:向左移动 <n> 位置,右边 用 <n> 个空格填充 (默认设置 )。
  •  RIGHT:向右移动 <n> 位置,左边 用 <n> 个空格填充 。
  •  CIRCULAR:向左移动 <n> 位置,以便 左边 <n> 个字符出现 在右边。
DATA: str(10) TYPE c VALUE 'abcdefghij',
      c LIKE str.

c = str.
WRITE /:c.                    "abcdefghij
SHIFT c.                      "bcdefghij
WRITE /:c.
c = str.
WRITE /:c.
SHIFT c BY 3 PLACES.          "defghij   后面有三个空格
WRITE /:c.
c = str.
WRITE /:c.
SHIFT c BY 3 PLACES LEFT.     "defghij   后面有三个空格  
WRITE /:c.
c = str.
WRITE /:c.
SHIFT c BY 3 PLACES RIGHT.    "   defghij
WRITE /:c.
c = str.
WRITE /:c.
SHIFT c BY 3 PLACES CIRCULAR. "defghijabc
WRITE /:c.

移动字符串中的某字段

语法:SHIFT <str> UP TO <c>  <mode>.

在<str>字符串中查找<c>字段,找到了便将<c>字段移动到字符串<str>的边缘,<mode>和上文一致,<str>中找不到<c>字段则将 SY-SUBRC 设置为 4 并且不移动 <c>。

DATA: string(10) TYPE c VALUE 'abcdefghij',
      str LIKE string,
      c(2) TYPE c VALUE 'cd'.

str = string.
WRITE /:str.                  "abcdefghij
SHIFT str UP TO c.            "cdefghij
WRITE /:str.
str = string.
WRITE /:str.
SHIFT str UP TO c LEFT.       "cdefghij
WRITE /:str.
str = string.
WRITE /:str.
SHIFT str UP TO c RIGHT.      "      abcd
WRITE /:str.
str = string.
WRITE /:str.
SHIFT str UP TO c CIRCULAR.   "cdefghijab
WRITE /:str.

根据第一个或最后一个字符移动字段串

语法:SHIFT <str> LEFT[RIGHT] DELETING LEADING <c>.

假设<str>左边的第一个字符或右边的最后一个字符<c>出现在中,该语句将字段 <str>向左或向右移动。字段右边或左边 用空格填充 。<str> 可为变量。

DATA: string(15) TYPE c VALUE '     abcdefghij',
      str LIKE string,
      c(4) TYPE c VALUE 'ghij'.

str = string.
WRITE /:str.                                    "     abcdefghij
SHIFT str LEFT DELETING LEADING space.          "abcdefghij
WRITE /:str.
str = string.
WRITE /:str.
SHIFT str LEFT DELETING LEADING c.              "     abcdefghij
WRITE /:str.
str = string.
WRITE /:str.
SHIFT str RIGHT DELETING TRAILING space.        "     abcdefghij
WRITE /:str.
str = string.
WRITE /:str.
SHIFT str RIGHT DELETING TRAILING c.            "         abcdef
WRITE /:str.

CONDENSE压缩字段内容

语法:CONDENSE <str> [NO-GAPS].

该语句去除字段中的前导空格并用一个空格替换其它空格序列(有多个空格的会剩一个空格)。 如果指定附 加的 NO-GAPS, 则去除所有空格。

DATA: str(15) TYPE c VALUE '     a  b  c'.

WRITE /:str.                 "     a  b  c
CONDENSE str.
WRITE /:str.                 "a b c
str = '     a  b  c'.
CONDENSE str NO-GAPS.
WRITE /:str.                 "abc

CONCATENATE连接字符串

语法:CONCATENATE <c1>...<cn> INTO <c> [SEPARATED BY <s>].

将c1>...<cn>等字段连接到<c>中,<s>为分隔符

DATA: c(30) TYPE c,
      c1(5) TYPE c VALUE 'aaaaa',
      c2(5) TYPE c VALUE 'bbbbb',
      c3(5) TYPE c VALUE 'ccccc',
      s1(3) TYPE c VALUE ' - ',
      s2(1) TYPE c VALUE '-'.

CONCATENATE c1 c2 c3 INTO c.                   "aaaaabbbbbccccc
WRITE /:c.
CONCATENATE c1 c2 c3 INTO c SEPARATED BY s1.   "aaaaa - bbbbb - ccccc
WRITE /:c.
CONCATENATE c1 c2 c3 INTO c SEPARATED BY s2.   "aaaaa-bbbbb-ccccc
WRITE /:c.

STRLEN、XSTRLEN获取字符串长度

语法:<n> = STRLEN(<c>)

STRLEN 将操作数 <c> 作为字符数 据类型处理 ,而不考虑其实际类型 。

DATA: int TYPE i,
      c1(20) TYPE c VALUE '12345',
      c2(20) TYPE c VALUE '  3  ',
      c3(20) TYPE c.
int = strlen( c1 ).         "5
WRITE / int.
int = strlen( c2 ).         "3
WRITE / int.   
int = strlen( c3 ).         "0
WRITE / int.

SEARCH搜索字符串

语法:SEARCH <str> FOR <c> <options>.

<pattern>                 搜索 <pattern>(任何字符顺序)。忽略尾部空格。  

.<pattern>.               搜索 <pattern> ,但是不忽略尾部空格 。

*<pattern>               搜索以 <pattern> 结尾的词。  

<pattern>*               搜索以 <pattern> 开始的词。  

该语句在字段<str>中搜索<c>中的字符串,如果成功 ,则将 SY-SUBRC 的返回代码值设置为0,并将 SY-FDPOS设置为字段<c>中该字符串的偏移量。否则将 SY-SUBRC 设置为4。

DATA: str(30) TYPE c VALUE 'This is a test.'.
SEARCH str FOR 'X'.
WRITE : sy-subrc,sy-fdpos.  "4,0
SKIP.
SEARCH str FOR 'i'.
WRITE : sy-subrc,sy-fdpos.  "0,2
SKIP. 
SEARCH str FOR '.a.'.
WRITE : sy-subrc,sy-fdpos.  "0,8
SKIP.
SEARCH str FOR '*t'.
WRITE : sy-subrc,sy-fdpos.  "0,10
SKIP.
SEARCH str FOR 't*'.
WRITE : sy-subrc,sy-fdpos.  "0,0

搜索字符字段 <str> 的各种选项 (<options>) 如下:

  • ABBREVIATED

在字段 <str> 中搜索包含 <c> 中的单词, 其中字符可以被其它字符隔开,但是单词和字符串的第一个字母必须相同 。

  •  STARTING AT <n1>

在字段 <str> 中搜索从 <n1> 开始的 <c> 。结果 SY-FDPOS 参照相对于 <n1> 的偏移量而 不是字段的 开始。

  • ENDING AT <n2>

在字段 <str> 搜索 <c> 直到位置 <n2>。

  •  AND MARK

如果找到搜索串,则将搜索串中的所有字符(使用ABBREVIATED 时的所有字符)转换为大写形式。

DATA: STRING(30) VALUE 'This is a fast first example.',
      POS TYPE I,
      OFF TYPE I.
WRITE / STRING.                        "This is a fast first example.
SEARCH STRING FOR 'ft' ABBREVIATED.
WRITE: / 'SY-FDPOS:', SY-FDPOS.        "10
POS = SY-FDPOS + 2.
SEARCH STRING FOR 'ft' ABBREVIATED STARTING AT POS AND MARK.
"在找到单词‘ fast’之后,为了查找包含‘ ft’的第二个单词,必须在偏移量SY-FDPOS上加2,
"然后从位置POS开始查找。否则,会再次找到单词 ‘fast’ 。
"要获得‘ first’ 相对于字段 STRING 开始的偏移量,从 POS 和 SY-FDPOS 计算。
WRITE / STRING.                        "This is a fast FIRST example.
WRITE: / 'SY-FDPOS:', SY-FDPOS.        "4
OFF = POS + SY-FDPOS -1.
WRITE: / 'Off:', OFF.                  "15

在找到单词‘ fast’ 之后,为了 查找包含‘ ft’的第 二个单词, 必须在偏移 量 SY-FDPOS 上加2,然 后从位置 POS 开始查找。 否则,会再 次找到单词 ‘fast’ 。要获得‘ first’ 相对于字段 STRING 开始的偏移 量,从 POS 和 SY-FDPOS 计算。

OVERLAY覆盖字符字段

语法:OVERLAY <c1> WITH <c2> [ONLY <str>].

该语句用字符串 <c2> 中相应位置上的内容“覆盖” 字段 <c1> 中包含 <str> 中字母的所有位置。<c2> 保持不变。如果省略 ONLY <str>, 则覆盖字段 <c1> 中所有包含空格的位置 ,如果没有空格,则<c1>不会被“覆盖”。如果至少要替换 <c1> 中的一个字符,则将 SY-SUBRC设置为 0。对于所有其它情况 ,将SY-SUBRC设置为4。如果 <c1> 比 <c2> 长,则只覆盖 <c2> 中的长度。

OVER '1 2 3' WITH '456   '. 结果为:152 3。

OVER '1 2 3' WITH '456' only '12'.结果为:4 6 3 。

OVER '123' WITH '456'.结果为:123。(没有空格)

OVER '1 2 3 ' WITH '456   ' only '13' .结果为:4 2  。

REPLACE替换字段内容

语法:REPLACE <c1> WITH <c2> INTO <str> [LENGTH <l>].

将<str>字符串中的第一个<c1>替换成<c2>,若指定了长度则替换该长度内的字段(c1的长度)

REPLACE ALL OCCURRENCES OF '*' IN <str> WITH space.

将<str>中的'*'去掉

DATA: str(30) TYPE c VALUE 'abcdefghij.',
      c LIKE str,
      c1(4) TYPE c VALUE 'cdef',
      c2(4) TYPE c VALUE 'klmn',
      c3(3) TYPE c VALUE 'opq',
      len TYPE i VALUE 2.

c = str.
WRITE c.
REPLACE c1 WITH c2 INTO c.                "abklmnghij.
WRITE / c.
c = str.
REPLACE c1 WITH c2 INTO c LENGTH len.     "abklmnefghij.
WRITE / c.
c = str.
REPLACE c1 WITH c3 INTO c.                "abopqghij.
WRITE / c.
c = str.
REPLACE ALL OCCURRENCES OF '.' IN c WITH space.   "abcdefghij
WRITE / c.

TRANSLATE转换大/小写并替换字符

TRANSLATE <c> TO UPPER CASE.   转大写

TRANSLATE <c> TO LOWER CASE.  转小写

TRANSLATE <c> USING <r>.   该语句根据字段 <r> 中存储的替换规则替换字段 <c> 的所有字符

DATA: C(10) VALUE 'AbCdEfGhIj',
      STRING LIKE T,
      RULE(20) VALUE 'AxbXCydYEzfZ'.
STRING = C.
WRITE STRING.                     "AbCdEfGhIj
TRANSLATE STRING TO UPPER CASE.   "ABCDEFGHIJ
WRITE / STRING.
STRING = C.
TRANSLATE STRING TO LOWER CASE.   "abcdefghij
WRITE / STRING.
STRING = C.
TRANSLATE STRING USING RULE.      "xXyYzZGhIj
WRITE / STRING.

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值