ABAP基礎(chǔ)-字符串處理

1.概述

字符數(shù)據(jù)(又稱字串)指的是廣義的字符類型(包括C,N,D,T和String等類型)數(shù)據(jù)對(duì)象。對(duì)于字符串?dāng)?shù)據(jù)氧猬,ABAP提供了一些特有的操作語句背犯,這些操作在處理數(shù)據(jù)對(duì)象時(shí)不進(jìn)行類型轉(zhuǎn)換,一律照C類型對(duì)待盅抚。

2. 處理字符串?dāng)?shù)據(jù)

1.連接字符串漠魏,使用CONCATENATE
CONCATENATE s1 ... sn INTO s_dest [SEPARATED BY sep].

該語句連接字串s1...sn并將結(jié)果賦給s_dest,其中s_dest也可以是s1...sn中的某個(gè)變量。選項(xiàng)SEPARATED BY 用于指定一個(gè)字串作為分隔符妄均,在構(gòu)成新字串時(shí)插入在s1...sn之間柱锹。如果連接后的長(zhǎng)度超過了目標(biāo)數(shù)據(jù)定義長(zhǎng)度,則把截?cái)噘x給c丛晦。如結(jié)果出現(xiàn)截?cái)嗲闆r奕纫,SY-SUBRC返回4,否則該值返回0.要避免截?cái)嗵躺常梢詫定義為String,該類型長(zhǎng)度自適應(yīng)隙笆。

REPORT z_data_manipulation.
DATA: s1(9)  TYPE c VALUE 'Fristname',
      s2(10) TYPE c VALUE 'Secondname',
      s3(20),
      sep(1) TYPE c VALUE '.'.

CONCATENATE s1 s2 INTO s3.
WRITE / s3.
CONCATENATE s1 s2 INTO s3 SEPARATED BY sep.
WRITE / s3.
INTO

2.拆分字符串锌蓄,使用SPLIT
SPLIT s_source AT sep INTO s1...sn.

該語句在源字串中搜索分隔符sep,并根據(jù)該分割符將元字串拆成各個(gè)小串放到目標(biāo)字段s1 ... sn中撑柔,這些子串不包括分隔符瘸爽。與連接語句類型,如結(jié)果出現(xiàn)截?cái)嗲闆r铅忿,SY-SUBRC返回4剪决,否則該值返回0。如果源子串能夠拆分的子串多過指定數(shù)目檀训,則源子串最后剩余部分包括其后的分割符都將寫入最后一個(gè)子串柑潦,要避免這種情況,需要使用內(nèi)表進(jìn)行操作峻凫。
SPLIT s_source AT sep INTO TABLE itab.

REPORT z_data_manipulation.
DATA : text TYPE string,
       itab TYPE TABLE OF string.

text = 'ABAP is a programming language'.
SPLIT text  AT space INTO TABLE itab.
LOOP AT  itab INTO text.
  WRITE / text.
ENDLOOP.

語句LOOP AT用于循環(huán)輸出內(nèi)表的每一行數(shù)據(jù)渗鬼。


SPLIT

3.查找子串模式
在一個(gè)字符串中查找一個(gè)子字符串模式,使用SEARCH語句
SEARCH c FOR str.

改語句在字段c中查找字符串str荧琼。如果找到譬胎,則將SY-SUBRC返回0差牛,SY-FDPOS返回字段c中該字符串的位置(從做算起的字節(jié)偏移量),否則將SY-SUBRC返回4堰乔。所謂模式是指要查找的字串不一定與str完全一致偏化,可以設(shè)定忽略或保留str末尾的空格,或利用通配符“*”擴(kuò)大其查找靈活性镐侯,由下列幾種模式:

  • str 搜索str并忽略尾部空格
  • .str. 搜索str夹孔,但是不忽略尾部空格
  • *str 搜索以str結(jié)尾的單詞
  • str* 搜索以str開始的單詞
REPORT z_string_search.
DATA string(30) TYPE c VALUE 'This is a testing sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.

SEARCH string FOR 'X'.
WRITE: / 'X', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.

SEARCH string FOR 'itt   '.
WRITE: / 'itt   ',sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.

SEARCH string FOR '.e .'.
WRITE: / '.e .', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.

SEARCH string FOR '*e'.
WRITE: / '*e ', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.

SEARCH string FOR 's*'.
WRITE: / 's*', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH

4.替換字段內(nèi)容,使用REPLACE語句析孽。
REPLACE str1 WITH str2 INTO s_dest [LENGTH len].

該語句對(duì)字段s_dest進(jìn)行搜索搭伤,如果在其中出現(xiàn)了字符串str1,則用str2替換第一次出現(xiàn)的部分袜瞬。如果未指定長(zhǎng)度怜俐,則搜索整個(gè)s_dest。如果指定長(zhǎng)度len邓尤,則只搜索前l(fā)en個(gè)字節(jié)拍鲤。如果字段SY-SUBRC返回0,則說明已經(jīng)替換汞扎;非0則意味著未進(jìn)行替換季稳。

REPORT z_string_replace.
DATA name TYPE string.

name = 'Michael-Cheong'.
WHILE sy-subrc = 0.
  REPLACE '-' WITH ' ' INTO name.
ENDWHILE.
WRITE / name.
REPLIACE

5.確定字段長(zhǎng)度,不包括結(jié)尾空格澈魄,使用STRLEN景鼠,語句將操作數(shù)str作為字符數(shù)據(jù)類型處理,不考慮實(shí)際類型痹扇,也不進(jìn)行轉(zhuǎn)換
[COMPUTE] n = STRLEN( str ).

REPORT z_string_strlen.
DATA: text(24) TYPE c VALUE 'ABAP Language',
      len      TYPE i.

len = strlen( text ).
WRITE: / 'Length of', text, 'is', len.
strlen

6.其他操作

  • SHIFT 將字符串整體或子串進(jìn)行位移
  • CONDENSE 刪除字符串中的多余空格
  • TRANSLATE 字符轉(zhuǎn)換铛漓,例如將ABC轉(zhuǎn)換為abc
  • CONVERT TEXT 創(chuàng)建一個(gè)可以排序的格式
  • OVERLAY 用一個(gè)字符串覆蓋另一個(gè)字符串
  • WRITE TO 賦值時(shí),將忽略數(shù)據(jù)對(duì)象類型鲫构,將其視為字符類型數(shù)據(jù)

3. 字符數(shù)據(jù)比較

字符型邏輯表達(dá)式用于判斷兩個(gè)字符串之間的包含關(guān)系

運(yùn)算符 含義
s1 CO s2 如果s1僅包含s2中的字符浓恶,則邏輯表達(dá)式為真
s1 CN s2 如果s1包含s2之外的其他字符,則邏輯表達(dá)式為真
s1 CA s2 如果s1包含任何一個(gè)s2中的字符结笨,則邏輯表達(dá)式為真
s1 NA s2 如果s1不包含s2的任何字符包晰,則邏輯表達(dá)式為真
s1 CS s2 如果s1包含字符串s2,則邏輯表達(dá)式為真
s1 NS s2 如果s1不包含字符串s2炕吸,則邏輯表達(dá)式為真
s1 CP s2 如果s1包含模式s2伐憾,則邏輯表達(dá)式為真
s1 NP s2 如果s1不包含模式s2,則邏輯表達(dá)式為真

CO,CN,CA,NA比較時(shí)要區(qū)分大小寫算途,并且尾部空格也在比較的范圍之內(nèi)塞耕;使用CS,NS,CP,NP比較時(shí)忽略尾部空格并且比較不區(qū)分大小寫。比較結(jié)束后嘴瓤,如果結(jié)果為真扫外,系統(tǒng)字段SY-FDPOS將給出s2在s1中偏移量信息莉钙。

REPORT z_string_replace.
DATA: s1 TYPE string,
      s2 TYPE string.
s1 = 'SAP ABAP'.
s2 = 'ABAP'.

IF s1 CS s2.
  WRITE: / s2, 'is in Position', sy-fdpos,
  'of', s1, 'Stirng'.
ENDIF.
字符串比較

CP和NP被稱為模式比較邏輯表達(dá)式,意義在于可以使用通配符筛谚。
“*”用于替代任何字符串磁玉,“+”用于替代任何單個(gè)字符。
如需對(duì)大小寫或尾部空格進(jìn)行區(qū)分比較驾讲,需要將換碼字符“#”放到相應(yīng)的字符前蚊伞。下面列出可以使用“#”指定的功能:

  • 大小寫字符,指定大小寫(如#A,#b)
  • 通配符“”(輸入#)吮铭,將其轉(zhuǎn)回原意
  • 通配符“+”(輸入#+)时迫,將其轉(zhuǎn)回原意
  • 換碼符號(hào)本身(輸入##),將其轉(zhuǎn)回原意
  • 字符串結(jié)尾的空格(輸入#_),指定比較結(jié)尾空格

3 定位操作子串

僅操作指定的部分子串谓晌。s [+o][(1)]
其意義是對(duì)字段s從第o位開始(從0開始偏移)且長(zhǎng)度為1的部分執(zhí)行該語句操作掠拳。如果未指定長(zhǎng)度,則對(duì)字段s第o和結(jié)尾之間的所有位進(jìn)行處理纸肉。

REPORT z_string_replace.
DATA: f1(8)  VALUE 'ABCDEFGH',
      f2(20) VALUE '12345678901234567890'.
f2+6(5) = f1+3(5).
WRITE : / f1, / f2.
定位操作

通常溺欧,必須將偏移量和長(zhǎng)度指定為無符號(hào)數(shù)。然而柏肪,一下情況中可以使用變量動(dòng)態(tài)指定:

  • 用MOVE語句或賦值運(yùn)算符給字段賦值時(shí)
  • 用WRITE TO語句向字段攜入值時(shí)
  • 用ASSIGN將字段分配給字段符號(hào)時(shí)
  • 用PERFORM將數(shù)據(jù)傳送給子程序時(shí)

對(duì)字符類型姐刁,數(shù)值文本字段,十六進(jìn)制字段烦味,日期和時(shí)間字段指定偏移量是有意義的聂使;類型F,I,P數(shù)值字段則不要使用指定偏移量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拐叉,一起剝皮案震驚了整個(gè)濱河市岩遗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凤瘦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件案铺,死亡現(xiàn)場(chǎng)離奇詭異蔬芥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)控汉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門笔诵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姑子,你說我怎么就攤上這事乎婿。” “怎么了街佑?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵谢翎,是天一觀的道長(zhǎng)捍靠。 經(jīng)常有香客問我,道長(zhǎng)森逮,這世上最難降的妖魔是什么榨婆? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮褒侧,結(jié)果婚禮上良风,老公的妹妹穿的比我還像新娘。我一直安慰自己闷供,他們只是感情好烟央,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歪脏,像睡著了一般疑俭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唾糯,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天怠硼,我揣著相機(jī)與錄音,去河邊找鬼移怯。 笑死香璃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舟误。 我是一名探鬼主播葡秒,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼嵌溢!你這毒婦竟也來了眯牧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赖草,失蹤者是張志新(化名)和其女友劉穎学少,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秧骑,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡版确,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乎折。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绒疗。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骂澄,靈堂內(nèi)的尸體忽然破棺而出吓蘑,到底是詐尸還是另有隱情,我是刑警寧澤坟冲,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布磨镶,位于F島的核電站溃蔫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棋嘲。R本人自食惡果不足惜酒唉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沸移。 院中可真熱鬧痪伦,春花似錦、人聲如沸雹锣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娃圆。三九已至冶忱,卻和暖如春馍资,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猜惋。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工折汞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咒劲,地道東北人会放。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓饲齐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親咧最。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捂人,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容