PR

【ABAP】REPLACE命令:文字列の置換方法を1分で解説

ABAP

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からわかりやすく解説します。

このページで学べる内容
  • REPLACE命令とは?
    • 構文ルールと使い方
    • REPLACE命令を利用する際の注意点
  • FIRST OCCURENCE OF / ALL OCCURENCES OF オプション

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命令を用いるのが一般的です。

後述する「ALL OCCURENCES」オプションを利用すると、全ての文字列を置換できます。

SY-SUBRCの値

置換に成功すると、SY-SUBRCの値は0に。失敗する(置換対象の文字列が存在しない)と4にセットされます。

REPLACE命令実行後の SY-SUBRC の値
  • 置換に成功:SY-SUBRC = 0
  • 置換に失敗:SY-SUBRC = 4
  • 置換に成功(条件つき):SY-SUBRC = 2.

条件付き成功というのは以下のような場合で、置換には成功しても置換結果の項目長が溢れてしまうような場合に、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とは?

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 OCCURRENCESRESPECTING CASEを使用しているので、テキスト内に複数の同一の文字列があった場合でも、大文字と小文字を厳密に区別して全ての'AA'が新しい文字列'A'に置換されます。

小文字の'aab'はそのままとなります。

ABAP:REPLACE命令のまとめ

  • ABAPのREPLACE命令は、文字列内の特定の部分文字列を他の文字列に置換するための命令。
  • REPLACE命令は、単一の置換や複数の置換、大文字と小文字の区別など、多様なオプションを指定可能。
  • REPLACE命令は、対象となる文字列が格納されている変数の内容を直接変更。
DATA: lv_text TYPE string VALUE 'Hello, World!'.

REPLACE 'World' WITH 'ABAP' IN lv_text.

WRITE: / lv_text.  " 出力結果: 'Hello, ABAP!'

初めてABAPを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。

ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?

あなたの技術、もっと価値ある場所で活かしませんか?
SAPエンジニアのキャリア支援はこちらから↓

No.1 > 外資系・IT業界などハイクラスの転職なら【アクシスコンサルティング】blank
4人に1人のコンサルタントが選ぶパートナー!
ビッグ4やアクセンチュアへの転職を実現し年収1000万へ。

No.2 > IT・Web転職特化エージェント【レバテックキャリアblank
blank
サービス利用者数20万人突破。

平均年収アップ率77%であなたの転職成功を保証します。

No.3 > blankリクルートエージェント
blank
\転職支援実績NO.1/

応募が殺到しすぎるが故に・・・非公開にせざるを得ない魅力的な求人が多数!

読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
ABAPSAP
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました