ABAP 字符串处理

234 阅读5分钟
取前N位
a = a(N). "取前N位
a = a+N(2). "取第N位后的2位
a = a+N . "取第N位后的所有字符
-------------------------------------------------------
拆分字符串
SPLIT {c} AT {del} INTO {c1} ... {cn}.
作用:按照分割字符del把字符串c分割成c1…cn。
SPLIT {c} AT {del} INTO TABLE {itab}.
作用:按照分割字符del把c分割,然后放到内表中的相应字段
--------------------------------------------------------
去空格
CONDENSE {c} [NO-GAPS].:
作用:去掉字符串中的前面和后面的空格,如果指定NO-GAPS,则去掉字符串中的所有空格。
常用场合:获得字符串的精确长度,用于判断。
-------------------------------------------------------
替换字符串
REPLACE {str1} WITH {str2} INTO {c} [LENGTH {l}].:
作用:把字符串c中的str1替换成str2,如果指定l,就是指定了替换的长度。如果替换成功,则SY-SUBRC设置成0。
-------------------------------------------------------
转换字符串
TRANSLATE {c} TO UPPER CASE.
TRANSLATE {c} TO LOWER CASE.:
 作用:字符串的大小写的转换
TRANSLATE {c} USING {r}. :
作用:根据规则r转换字符串c
-------------------------------------------------------
截断字符串
 SHIFT {c} [BY {n} PLACES] [{mode}].:
作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不变。如果n超出字符串的长度,则字符串变空,所以在做此操作的时候要注意n的指定。可以首先获得该字符串的长度,方法:len=STRLEN(C)。
Mode:指定字符串截断的方向。
 LEFT:从左边截断
RIGHT:从右边截断
CIRCULAR:把左边的字符放到右边。
SHIFT {c} UP TO {str} {mode}.:
作用:把字符串中在str以前的字符都去掉,同样可以指定mode,原理同上。
SHIFT {c} LEFT DELETING LEADING {str}.
SHIFT {c} RIGHT DELETING TRAILING {str}.:
作用:这两个语句就是把字符串c中前的(LEFT)或者后的(RIGHT)的字符str都去掉。
-------------------------------------------------------
查找字符串
SEARCH {c} FOR {str} {options}.:
作用:在字符串c中查找str,如果找到了,SY-SUBRC为0,SY-FDPOS为找到字符串的具体位置。
需要说明的地方:注意模式的使用
指定str:查找str,str中后面的空格忽略
指定.str.:查找str,包含了str中尾部的空格
指定*str:查找以str结尾的字符串
指定str*:查找以str开头的字符串
{options}的指定:
 主要用到的就是:STARTING AT {n1}指定开始位置, ENDING AT {n2}指定结束位置
-------------------------------------------------------
是否全是数字
if aaa CO '01234567888889 '.
---------------------------------------------------
REPORT  ZTEST009 .
DATA :str1 ( 20 )  TYPE  c ,
      str2 ( 20 )  TYPE  c ,
      str3 ( 20 )  TYPE  c ,
      str4 ( 20 )  TYPE  c ,
      str5 ( 20 )  TYPE  c .
str1  =  'hello ' .
str2  =  'world' .
CONCATENATE str1 str2  INTO str3 .  "合并时候去掉空格
CONCATENATE str1 str2  INTO str4  SEPARATED  BY  ',' . "合并时候加上指定字符
CONCATENATE str1 str2  INTO str5 RESPECTING BLANKS . "合并时候保留前后空格
WRITE : str3 ,/ str4 ,/ str5 .

字符串的处理在程序中的使用十分常见,在这里结合自己日常的使用对ABAP的字符串常用操作进行总结,以便后续使用。

1.获取字符串长度

var1 = strlen(str);将str作为字符数据处理,计算出其字符长度

DATA: l_len type i,	    
	str1(20) VALUE '1234'.	
	l_len = strlen(str1).
WRITE: / len.  

2.拼接字符串

  • CONCATENATE <str1> ... <strn> into <var> [SEPARATED BY <s>][RESPECTING BLANKS]
  • 将多个字符串拼接到指定的变量Var中,注意Var的长度
  • C,D,N,T类型的前导空格会保留,尾部空格会去掉,对String类型的所有空格都会保留
  • [SEPARATED BY <s>]:根据该间隔符号(S)进行拼接(SPACE)
  • respecting:针对C,D,N,T数据,表示尾部空格会保留

3.压缩字符串

  • CONDENCE <str> [NO-GAPS]:去除字段str中的前后空格,并将字段中多个空格使用一个空格替换;如果加上NO-GAPS则去除所有空格。

4.截取字符串

  • subtext = str+0(4):从最左边取出4个字符
  • subtext = str+2(4):从第2个字符开始取出4个字符
  • str+0(1) = ‘X’:变更指定位置的值

5.查找字符串

  • SEARCH <var> FOR <str> <options>.:在var中搜索子字符串,成功SY-SUBRC=0
  • str:可以使用正则表达式,也可以使用普通字符串

6.替换字符串

  • REPLACE <str1> WITH <str2> INTO <var> [LENGTH <l>].
  • 将str1在var中的字段替换为str2
  • 如果指定长度,则只将str1中指定长度的字符替换为str2中的内容
  • 如果替换后内容总长度超过var定义的长度,会出现截断现象

7.移动字符串内容

  • SHIFT <var> [BY <n> PLACES] [<mode>].
  • 将var移动n个位置,
  • MODE:LEFT(默认),RIGHT,CIRCULAR
  • SHIFT <var> LEFT DELETING LEADING <str>.
  • SHIFT <var> RIGHT DELETING TRAILING <str>.
  • 如果左边第一个字符串或则右边第一个字符串出现在str中,将var移动相应的位置

8.比较字符串

判断是否包含特定值

  • IF field CN ‘0123456789’.
  • IF field CN ‘ABCDEFG*’
  • IF field CN ‘abcdefg*’
  • IF field CN ‘/’ …..
CN:Contains Not Only (包含,不仅包含)CO:Contains Only(仅包含)
CS:Contains String (包含字符串)NS:Contains No String (不包含字符串)
NP:No Pattern (不包含记号)NA:Contains Not Only(不包含任何)
CA:Contains Any(包含任何)CP:Covers Pattern (包含记号)

9.拆分字符串

SPLIT dobj AT sep INTO {res1 res2……resn}. :将字符串的值分配给具体变量

SPLIT s_source AT sep INTO TABLE itab:将字符串的值分配给一内表。

10.大小写转换:

TRANSLATE c TO UPPER|LOWER CASE.:将字符串转换为大|小写

11.字符前拼接空格

在Grid ALV上也显示空格:

IF <fw_output>-name2+0(1) eq space AND <fw_output>-name2 IS NOT INITIAL.  
	h_white = cl_abap_conv_in_ce=>uccpi( 160 ).  
	REPLACE ALL OCCURRENCES OF REGEX '\s' IN <fw_output>-name2 WITH h_white.
ENDIF.

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情