ABAPにおける文字列操作命令:REPLACE命令について1分で解説します。
REPLACE命令はその名の通り指定した文字列を別の文字列に置き換える命令。うまく利用すれば、Excel関数のTRIM関数やSUBSTITUE関数のように利用可能です。
CONSTANTS: GC_A(01) TYPE C VALUE 'A', GC_B(01) TYPE C VALUE 'B'. DATA LV_TEXT TYPE STRING. LV_TEXT = 'AAAA'. * 'A'を'B' に置換 REPLACE GC_A IN LV_TEXT WITH GC_B.
参考 CONSTANTS命令 / DATA命令
このページでは、REPLACE命令の構文ルール・使い方やコツ、注意点をABAP初心者向けに1からわかりやすく解説します。
SAPエンジニアやABAPerを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
参考 ABAPの基本構文ルール
REPLACE命令とは?
REPLACE命令は、指定した文字列を別の文字列に置換する命令です。
REPLACE <f> IN <g> WITH <h>.
<f>
:検索する文字列やパターン。<g>
:検索と置換が行われる文字列。<h>
:置換用の文字列。
構文ルール自体は難しくはありません。早速実際のサンプルコードを見てみましょう。
LV_TEXT = 'AAAA' * 'A'を'B' に置換 REPLACE 'A' IN LV_TEXT WITH 'B'. * 結果 LV_TEXT ⇒「BAAA」
上記のコードを実行すると、指定した変数「LV_TEXT」に含まれる最初の文字 'A' が 'B' に置換されます。
注意すべきなのが、置換されるのは最初の文字列のみであるという点。
LV_TEXT = 'AAAABBBBAAAA' * 'AAAA'を'CCCC' に置換 REPLACE 'AAAA' IN LV_TEXT WITH 'CCCC. * 結果 LV_TEXT ⇒「CCCCBBBBAAAA」
↑のサンプルコードの場合、置換対象の文字列 'AAAA' は対象の変数に2回表れますが最初の1つしか置換されていないことが分かります。
対象の変数に指定した文字列が1つしかないことが確実に分かっている場合(もしくは、あえて最初の文字列のみを置換したい場合)にオプションなしでREPLACE命令を用いるのが一般的です。
SY-SUBRCの値
置換に成功すると、SY-SUBRCの値は0に。失敗する(置換対象の文字列が存在しない)と4にセットされます。
条件付き成功というのは以下のような場合で、置換には成功しても置換結果の項目長が溢れてしまうような場合に、SY-SUBRCが '2' にセットされます。
DATA LV_TEXT TYPE C LENGTH 4. LV_TEXT = 'ABCD' * 'A'を'123' に置換 REPLACE 'A' IN LV_TEXT WITH '1234. * 結果 LV_TEXT ⇒「123B」
SY-SUBRCとはシステム変数の1つで、処理の結果(成功 or 失敗)を保持します。
他のプログラミング言語を学んだ方であれば、Bool型の変数をイメージいただければ良いかと思います。詳しくは下記のページで、システム項目全般の解説を行っておりますので是非ご覧ください。
REPLACE命令のサンプルコード
(指定した文字列を削除)
DATA: lv_product_code TYPE string VALUE 'PRD-12345'. " 商品コードの初期化 REPLACE 'PRD-' IN lv_product_code WITH ''. " 'PRD-'を空文字列で置換(つまり削除) WRITE: / lv_product_code. " 結果を出力 * 結果「12345」
参考 WRITE命令
上記のコードは、商品コードに含まれる特定のプレフィクスを削除するABAPプログラムの一例。ここでは、プレフィクス 'PRD-' が商品コードから削除されます。
このように、REPLACE命令は指定した文字列を削除したいような場合にも有効的に利用することが可能です。
REPLACE命令はオプションを利用することで、さらに様々な文字列置換を行うことが可能です。次の章からは、REPLACE命令の各種オプションとその利用方法について詳しくご説明します。
REPLACE命令:オプション
REPLACE命令の各種オプションを4つご紹介します。
REPLACE { { FIRST OCCURRENCE } | { ALL OCCURRENCES } OF } <f> IN <g> WITH <h> [ { IGNORING CASE } | { RESPECTING CASE } ].
<f>
:検索する文字列やパターン。<g>
:検索と置換が行われる文字列。<h>
:置換用の文字列。
FIRST OCCURRENCE
:最初に見つかった文字列だけを置換します。このオプションはデフォルトであるため、オプションを何も指定しない場合の挙動と一致します。ALL OCCURRENCES
:指定した文字列に一致したすべての文字列を置換します。IGNORING CASE
:大文字と小文字を無視して文字列を検索。このオプションを指定しない場合、大文字と小文字を区別して検索されます。RESPECTING CASE
:大文字と小文字を区別して<f>
を検索します。大文字小文字の区別を明示的に指定する場合にはこちらを使用します。
1つ1つサンプルコード付きでご説明します。
REPLACE:FIRST OCCURRENCE
FIRST OCCURRENCE
は、指定された文字列中で最初に一致した箇所だけを置換します。
オプションを何も指定しない場合の挙動と同じ。
CONSTANTS: GC_A(01) TYPE C VALUE 'A', GC_B(01) TYPE C VALUE 'B'. DATA LV_TEXT TYPE STRING. LV_TEXT = 'AAAA'. * 最初の 'A' を 'B' に置換 REPLACE FIRST OCCURRENCE OF GC_A IN LV_TEXT WITH GC_B. * 結果 LV_TEXT⇒「BAAA」
↑のサンプルコードでは、LV_TEXTという変数に含まれる最初の「A」という文字列を「B」に置換しています。
REFRESH:ALL OCCURRENCES
ALL OCCURRENCES
は、指定された文字列中で一致した全ての箇所を置換します。
CONSTANTS: GC_A(01) TYPE C VALUE 'A', GC_B(01) TYPE C VALUE 'B'. DATA LV_TEXT TYPE STRING. LV_TEXT = 'AAAA'. * 'A'を'B' に置換 REPLACE ALL OCCURRENCES OF GC_A IN LV_TEXT WITH GC_B. * 結果 LV_TEXT⇒「BBBB」
これで、指定した変数の中に含まれる 'A' を 'B' に置換することができます。
ExcelのTRIM関数やSUBSTITUE関数のように利用したい場合は、こちらのオプションを利用するのがお勧めです。
ALL OCCURRENCES
オプションは、例えば連続した文字列(重複)を削除したい場合などに有効です。
CONSTANTS: GC_AA(02) TYPE C VALUE 'AA', GC_A(01) TYPE C VALUE 'A'. DATA LV_TEXT TYPE STRING. LV_TEXT = 'AAB AAB AAB'. * 'AA' を 'A' に置換 REPLACE ALL OCCURRENCES OF GC_AA IN LV_TEXT WITH GC_A. * 結果 LV_TEXT⇒「AB AB AB」
REFRESH:IGNORING CASE
IGNORING CASE
は、大文字と小文字を区別せずに指定された文字列を置換します。
CONSTANTS: GC_AA(02) TYPE C VALUE 'AA', GC_A(01) TYPE C VALUE 'A'. DATA: LV_TEXT TYPE STRING VALUE 'AAB AAB aab'. * 'AA' を 'A' に置換(大文字小文字を区別しない) REPLACE ALL OCCURRENCES OF GC_AA IN LV_TEXT WITH GC_A IGNORING CASE. WRITE: / LV_TEXT. " 出力結果: 'AB AB Ab'
'AAB'と'aab'の両方が'AB'と'Ab'にそれぞれ置換されます。これはIGNORING CASE
オプションにより大文字と小文字が区別されずに'AA'が'A'に置換されるためです。
REFRESH:RESPECTING CASE
RESPECTING CASE
は、大文字と小文字を厳密に区別して指定された文字列を置換します。
CONSTANTS: GC_AA(02) TYPE C VALUE 'AA', GC_A(01) TYPE C VALUE 'A'. DATA: LV_TEXT TYPE STRING VALUE 'AAB AAB aab'. * 'AA' を 'A' に置換(大文字小文字を厳密に区別) REPLACE ALL OCCURRENCES OF GC_AA IN LV_TEXT WITH GC_A RESPECTING CASE. WRITE: / LV_TEXT. " 出力結果: 'AB AB aab'
このコードでは、LV_TEXT
という変数に入っているテキスト内の全ての'AA'を'A'に置換しています。
その際、REPLACE ALL OCCURRENCES
とRESPECTING CASE
を使用しているので、テキスト内に複数の同一の文字列があった場合でも、大文字と小文字を厳密に区別して全ての'AA'が新しい文字列'A'に置換されます。
小文字の'aab'はそのままとなります。
ABAP:REPLACE命令のまとめ
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!