3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ILERPGAdvent Calendar 2023

Day 3

組み込み関数%SCANRPLと%REPLACEの違い

Last updated at Posted at 2023-12-02

%SCANRPLと%REPLACE

マニュアルを見ると'%SCANRPL'は「文字の走査と置換」、'%REPLACE'は「文字ストリングの置換」と書かれている。

どちらも文字列の置換をするために用いることができそうだが、その違いについて備忘録も兼ねてまとめておく。

%SCANRPL

基本的な使用方法

%SCANRPL(scan string : replacement : source { : scan start { : scan length } } )

パラメータ① (scan string)

検索する(置換ターゲットとなる)文字列。

パラメータ② (replacement)

置換後の文字列。

パラメータ③ (source)

検索対象となる文字列。

パラメータ④ (scan start)

検索開始位置。デフォルトは'1'

パラメータ⑤ (scan length)

検索する文字数。検索開始位置からパラメータ③の残りの文字数がデフォルト。0以上かつデフォルト値以下である必要あり。

パラメータ③の中の①を②で置き換える。そのときにパラメータ④で開始位置、パラメータ⑤で開始位置から何文字検索するかを指定することができる。

使用例と結果

SCANRPLR
D  STR1           S             50A   INZ('TOM IS WORKING.TOM IS EATING.')   
         
C                   EVAL      RESULT1 = %SCANRPL('TOM':'MIKE': STR1 )  
C     RESULT1       DSPLY                                              
C*                                                                     
C                   EVAL      RESULT1 = %SCANRPL('TOM ':'': STR1 )     
C     RESULT1       DSPLY                                              
C*                                                                     
C                   EVAL      RESULT1 = %SCANRPL('TOM':'MIKE': STR1:   
C                                      +   1 : %SCAN('.':STR1 ))       
C     RESULT1       DSPLY                                              
C*                                                                     
C                   EVAL      RESULT1 = %SCANRPL('TOM':'MIKE': STR1:   
C                                      + %SCAN('.':STR1 ): 20)         
C     RESULT1       DSPLY                                              

image.png

%REPALCE

基本的な使用方法

%REPLACE(replacement string: source string { : start position { : source length to replace } } )

パラメータ① (replacement string)

置換後の文字列。

パラメータ② (source string)

対象となる文字列。

パラメータ③ (start position)

置換開始位置。デフォルトは'1'。パラメータ②の長さ以下である必要あり。

パラメータ④ (source length to replace)

置換する文字数。デフォルトはパラメータ①の値。パラメータ②の文字数以下である必要あり。0のときは、パラメータ③で指定した位置の前に挿入するのと同じ

パラメータ②の文字列をパラメータ③で指定した開始位置からパラメータ④で指定した文字数分、パラメータ①で置き換える。

使用例と結果

REPLACER
D  STR1           S             50A   INZ('TOM IS WORKING.TOM IS EATING.')    
D  STR2           S             50A   INZ('NAME IS TOM. NAME IS MIKE.')       

C                   EVAL      RESULT2 = %REPLACE('HE': STR1 )          
C     RESULT2       DSPLY                                              
C*                                                                     
C                   EVAL      RESULT2 = %REPLACE('HE': STR1 : 1 :      
C                                       + %SCAN(' ' : STR1)-1)         
C     RESULT2       DSPLY                                              
C*                                                                     
C                   EVAL      RESULT2 = %REPLACE('': STR1 : 1 :        
C                                       + %SCAN(' ' : STR1))           
C     RESULT2       DSPLY                                              
C*
C                   EVAL      RESULT2 = %REPLACE('HIS ': STR2 : 1 : 0 )  
C     RESULT2       DSPLY                                                

image.png

2つを比較して

  • '%REPLACE'は、文字列の置換または挿入を一度しか行うことができないのに対し、
    '%SCANRPL'は、指定した範囲内であれば何度でも文字列の置換ができるという点で使い勝手がよさそう。

  • '%SCANRPL'は、置換元の文字列、置換後の文字列の両方を指定できるため、置換後の文字列と置換する場所(置換開始場所と置換する文字数)を指定する'%REPLACER'より直感的に扱うことが出来そう。

  • 基本的に'%REPLACE'でできることは'%SCANRPL'でもできるが、文字列の挿入だけは、'%REPLACE'でないとできない。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?