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


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

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

## %SCANRPL
### 基本的な使用方法
>%SCANRPL(scan string : replacement : source { : scan start  { : scan length  } } )


パラメータ① (scan string)

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

パラメータ② (replacement)

置換後の文字列。

パラメータ③ (source)

検索対象となる文字列。

パラメータ④ (scan start)

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

パラメータ⑤ (scan length)

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

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

### 使用例と結果
```rpgle: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070417/5a819e17-f92c-dd0a-c4b9-b2ec578b667b.png)


## %REPALCE
### 基本的な使用方法
>%REPLACE(replacement string: source string { : start position { : source length to replace } } )


パラメータ① (replacement string)

置換後の文字列。

パラメータ② (source string)

対象となる文字列。

パラメータ③ (start position)

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

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

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

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

### 使用例と結果
```rpgle: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070417/dd3ef7f8-357d-c284-edb6-072b2d225cf1.png)



# ２つを比較して

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

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

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