替换“ REGEX”:实际的越野车是多少?

时间:2018-07-09 14:16:16

标签: regex escaping abap

我正在尝试替换其中的一些字符

  1. 一个字符(30)
  2. 一个字符串

结果不同。

示例:

  • 删除最后一次出现的分号“;”(通过发行)。

    用''替换正则表达式'; $'在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.

1 个答案:

答案 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