RPG IV中的字符串替换方法

时间:2009-04-30 01:22:26

标签: ibm-midrange rpgle

在RPG IV中,如何获取字符串并删除特定字符的所有实例或用另一个字符替换它们?这有点像其他programmnig语言中的字符串替换内置方法。例如:取021-123450-23-4并转换为021123450234

4 个答案:

答案 0 :(得分:4)

%xlate的正确语法是:

%XLATE(从:至:字符串{:startpos})

用&符号替换所有连字符:

new_string =%xlate(' - ':'&':string);

删除所有连字符:

您无法使用& xlate删除字符。 7.1给出了%scanrpl,但在此之前,请使用以下内容:

for i = 1 to %len(string);
    char = %subst(string:i:1);
    if char <> '-';
        new_string += char;
    endif;
endfor;

答案 1 :(得分:3)

答案 2 :(得分:2)

我有同样的问题。所以我写了我自己的RPG程序,它为我做了:

     **
     **
     D************************************************************************
     D*                                                                      *
     D*  Procedure 'skReplace' -- Replaces text in 'text' string,            *
     D*                           searching for 'find' string,               *
     D*                           replacing with 'new' string.               *
     D*                           All occurances are replaced, not just one. *
     D*  Parameters: @txt = 'text' string                                    *
     D*              @fnd = 'find' string                                    *
     D*              @new = 'new' string (that replaces 'find' in 'source')  *
     D*                                                                      *
     D*  Update history:                                                     *
     D*  2013-04    Created by Shawn Kovac.                                  *
     D*                                                                      *
     D************************************************************************
     D*
     P skReplace       B
     D skReplace       PI           999A   Varying
     D    @txt                      999A   VALUE Varying
     D    @fnd                      999A   VALUE Varying
     D    @new                      999A   VALUE Varying
     D    @pos         S              3  0
     D*
      /free
       if (%Len(@fnd) = 0); // text to find cannot be empty.
          return @txt;
       endif;
       @pos = 1;
       dou (@pos = 0);
           @pos = %scan(@fnd: @txt: @pos);
           if (@pos > 0);
               @txt = %replace( @new : @txt : @pos : %Len(@fnd) );
               @pos = @pos + %Len(@new);
               if (@pos > %Len(@txt));
                   @pos = 0;
               endif;
           endif;
       enddo;

       return @txt;

      /end-free
     P skReplace       E
     **
     **

由于RPG对于哪些列的内容非常挑剔,因此当您复制和重复使用此代码时,您可能需要调整粘贴的文本,因此在D *&#39;之前有5个空格,& #39; **&#39;和&#39; P skReplace ...&#39;。之前有六个空格&#39; / free&#39;。并且&#39; / free&#39;之间的所有代码行有7个或更多空格。

我欢迎任何改进此代码的建议。 如果有人想要的话,我也有Left,Right和Mid的程序。如果你这样做,请告诉我。我很乐意与大家分享。我知道RPG有一个&#39;%subst&#39;函数,但许多编程语言都很挑剔,如果参数无效就会出错。我的反而提供了更大的灵活性,例如,Left(&#39; aoeu&#39;, - 1)返回&#39; aoe&#39; (1个字符短于完整字符串),右(&#39; aoeu&#39;, - 1)返回&#39; oeu&#39; (删除1个字符后字符串的右侧部分)。我的Mid程序也允许负起始位置,也从字符串的结尾开始索引,我觉得这对我有用。但对于任何想花时间问我的人来说,他们都是免费的。

快乐的编码!

答案 3 :(得分:0)

要删除角色,您可以使用此

strRes = %scanrpl('-':'':strSrc);