我正在尝试替换其中的一些字符
结果不同。
示例:
删除最后一次出现的分号“;”(通过发行)。
用''替换正则表达式'; $'在lv_atwrt_txt中。
为字符串工作,但对于CHAR(在我的情况下为30)似乎失败。
另一方面,通过此行删除char(30)中的最后一个管道(如果只有一个)可以工作
REPLACE REGEX '\|$' IN <content>-atnam WITH space.
但是,在char(30)中确实存在2个管道之后,像这样的替换失败。
REPLACE REGEX '\|$' IN lv_atnam_txt WITH ''
寻找分号
如果对字符串进行操作并删除分号,则一切工作正常,无论多少,我都想找到最后一个并删除分号...这是可行的,但是再次,对于字符串上的“管道”,当它发生了不止一次。
我用“&”号替换了管道,但问题依旧……
我创建了一个测试程序,该程序在字符串中包含3个管道,最后还包含一个管道。如预期的那样。
区别在于,在我的测试程序中,字符串是在定义期间直接填充的。
在我的生产程序中,字符串是连接在一起的,有时我在字符串的末尾放置了一个管道。稍后,我需要在最后删除此LAST管道... 现在,我调试并弄清楚,当我在调试器中修改字符串时,这不会失败……尽管它看起来相同。
我的测试场景如下:
在连接我的字符串然后想要删除最后一个管道时...失败,在定义期间初始化字符串时,它按预期工作。在调试器中修改我的串联字符串时,它可以工作。
在调试器中,我有一个长度为26的串联字符串(最后一个管道“ |”)。
当我对此进行修改时(先删除管道前的空格,然后再次输入),字符串的长度为25,然后正则表达式找到并删除它。
有人可以解释吗?
已更新相应的代码行:
LOOP AT lt_atnams_atwrts INTO DATA(line_x).
lv_atnam_txt = lv_atnam_txt && line_x-atnam_txt
&& ` `
&& zif_atnam_atwrt_const=>c_atnam_group_delim
&& ` `.
IF line_exists( inob_details[ objek = <content>-matnr ] ).
DATA(inob) = inob_details[ objek = <content>-matnr ] .
LOOP AT ausp_details INTO DATA(atinn) WHERE objek = inob-cuobj.
IF line_exists( cabn_details[ cabn_atnam = line_x-atnam
cawn_atinn = atinn-atinn ]
).
lv_atwrt_txt = lv_atwrt_txt && cabn_details[ cabn_atnam = line_x-atnam
cawn_atinn = atinn-atinn
]-cawn_atwtb
&& zif_atnam_atwrt_const=>c_atnam_atwrt_delim.
ENDIF.
ENDLOOP.
REPLACE REGEX ';$' IN lv_atwrt_txt WITH ''.
ENDIF.
IF lv_atwrt_txt IS NOT INITIAL.
lv_atwrt_txt = lv_atwrt_txt && ` | `.
ENDIF.
ENDLOOP.
ENDLOOP.
" THOSE TWO FAIL
REPLACE REGEX '\|$' IN lv_atwrt_txt WITH space.
REPLACE REGEX '\|$' IN lv_atnam_txt WITH space.
答案 0 :(得分:3)
这是因为REGEX考虑了CHAR30的整个30个字符。然后,您将替换最后一个字符SPACE
。
尝试一下:
data: lv_atwrt_txt type atwrt,
lv_atwrt_str type string.
START-OF-SELECTION.
lv_atwrt_txt = 'Hello ;'.
lv_atwrt_str = 'Hello;'.
REPLACE REGEX ';$' IN lv_atwrt_txt WITH ''.
REPLACE REGEX ';$' IN lv_atwrt_str WITH ''.
WRITE lv_atwrt_txt.
WRITE / lv_atwrt_str.
您将获得以下输出:
Hello
Hello
lv_atwrt_txt
的十六进制内容:
480065006C006C006F002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000
lv_atwrt_str
的十六进制内容:
480065006C006C006F00