偶然之間,從別人處偷得如何找到字符串當中逗號位置的方法
DATA: result_wa TYPE match_result,
result_tab TYPE match_result_tab.
DATA: text(140) TYPE c
VALUE
'No. 128, Gong 5th Rd., Longtan Township, Taoyuan County,325,TW'.
FIND ALL OCCURRENCES OF REGEX ',' IN text RESULTS result_tab.
那么,如何找到這個字符串當中的空格位置呢?開始,嘗試使用下面的語句,發現會造成ABAP DUMP
FIND ALL OCCURRENCES OF REGEX ' ' IN Text RESULTS result_tab.
上網查詢了REGEX單詞的意思,原來是“正則表達式”的含義,因為正則表達式中無法識別 ' ' 字符所以出現了ABAP DUMP。
於是仿照找到的資料修改語句,就可以實現了
FIND ALL OCCURRENCES OF REGEX '\s' IN Text RESULTS result_tab.
再次感嘆ABAP語言的強大,其實很多高級語言裡的功能ABAP都有集成,隨帖附上我找到的《深入淺出正則表達式》,雖然不太常用,但是字符串操作在FORM和WRITE輸出當中還是會涉及到的~
*示例代碼一 用於FROM中不被逗號和空格截斷
*拆分地址字段
data:l_text(141) type c,
l_temp(141) type c,
result_wa type match_result,
result_tab type match_result_tab,
lt_space(70) occurs 0 with header line,
count type i,
num type i.
condense:t_header-address1,
t_header-address2,
t_header-address3.
clear:l_text,l_temp,result_wa,count,num.
refresh:result_tab[],lt_space[].
l_text = t_header-address1.
*將空格轉換為,并確定所有,&空格位置
split l_text at space into table lt_space.
loop at lt_space.
concatenate l_temp lt_space ',' into l_temp.
endloop.
find all occurrences of regex ',' in l_temp
results result_tab.
*根據得到的,&空格位置處理字符串
count = strlen( t_header-address1 ).
if count > 56.
loop at result_tab into result_wa.
if result_wa-offset < 56.
continue.
else.
sy-tabix = sy-tabix - 1.
read table result_tab index sy-tabix into result_wa.
num = result_wa-offset.
exit.
endif.
endloop.
*得到第一行最後一個,或空格的位置,根據位置拆分字段
if num = 55.
p1_ad1 = l_text+0(56).
p2_ad1 = l_text+56(56).
else.
num = num + 1.
p1_ad1 = l_text+0(num).
count = 112 - num + 1.
p2_ad1 = l_text+num(count).
endif.
else.
p1_ad1 = l_text+0(56).
endif.
clear:l_text,l_temp,result_wa,count,num.
refresh:result_tab[],lt_space[].
l_text = t_header-address2.
*將空格轉換為,并確定所有,&空格位置
split l_text at space into table lt_space.
loop at lt_space.
concatenate l_temp lt_space ',' into l_temp.
endloop.
find all occurrences of regex ',' in l_temp
results result_tab.
*根據得到的,&空格位置處理字符串
count = strlen( t_header-address2 ).
if count > 56.
loop at result_tab into result_wa.
if result_wa-offset < 56.
continue.
else.
sy-tabix = sy-tabix - 1.
read table result_tab index sy-tabix into result_wa.
num = result_wa-offset.
exit.
endif.
endloop.
*得到第一行最後一個,或空格的位置,根據位置拆分字段
if num = 55.
p1_ad2 = l_text+0(56).
p2_ad2 = l_text+56(56).
else.
num = num + 1.
p1_ad2 = l_text+0(num).
count = 112 - num + 1.
p2_ad2 = l_text+num(count).
endif.
else.
p1_ad2 = l_text+0(56).
endif.
clear:l_text,l_temp,result_wa,count,num.
refresh:result_tab[],lt_space[].
l_text = t_header-address3.
*將空格轉換為,并確定所有,&空格位置
split l_text at space into table lt_space.
loop at lt_space.
concatenate l_temp lt_space ',' into l_temp.
endloop.
find all occurrences of regex ',' in l_temp
results result_tab.
*根據得到的,&空格位置處理字符串
count = strlen( t_header-address3 ).
if count > 56.
loop at result_tab into result_wa.
if result_wa-offset < 56.
continue.
else.
sy-tabix = sy-tabix - 1.
read table result_tab index sy-tabix into result_wa.
num = result_wa-offset.
exit.
endif.
endloop.
*得到第一行最後一個,或空格的位置,根據位置拆分字段
if num = 55.
p1_ad3 = l_text+0(56).
p2_ad3 = l_text+56(56).
else.
num = num + 1.
p1_ad3 = l_text+0(num).
count = 112 - num + 1.
p2_ad3 = l_text+num(count).
endif.
else.
p1_ad3 = l_text+0(56).
endif.
*示例代碼二
*split address 20090218
data:l_length type i,
l_length1 type i,
l_length2 type i,
l_length3 type i,
l_length5 type i,
result_wa1 type match_result,
result_tab1 type match_result_tab.
l_length1 = strlen( t_header-street ).
if l_length1 > 46.
find all occurrences of regex ',' in t_header-street
results result_tab1.
*start 20090219
l_length = 45.
do.
if l_length = -1.
exit.
endif.
if t_header-street+l_length(1) = ' '.
l_length = l_length + 1.
exit.
else.
l_length = l_length - 1.
endif.
enddo.
*end 20080219
loop at result_tab1 into result_wa1.
if result_wa1-offset < 46.
l_length5 = result_wa1-offset + 1.
else.
exit.
endif.
endloop.
if l_length5 > l_length and l_length >= 0.
l_length2 = l_length.
l_length1 = l_length1 - l_length2.
g_street1 = t_header-street(l_length2).
g_street2 = t_header-street+l_length2(l_length1).
else.
*start 20080219
g_street1 = t_header-street(l_length).
l_length1 = l_length1 - l_length.
*end 20080219
g_street2 = t_header-street+l_length(l_length1).
endif.
else.
g_street1 = t_header-street.
endif.
clear: l_length1.
[ 本帖最后由 lorryhappy 于 2009-3-24 13:44 编辑 ]
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21122155/viewspace-578420/
,如需转载,请注明出处,否则将追究法律责任。