COBOL2002 言語 拡張仕様編


25.5.6 SUBSTRING関数

SUBSTRING関数は,指定した開始位置と長さによって,指定したデータ項目中の文字列から部分文字列を返す。この関数の型は,引数の型に従って次のとおりとする。

引数の型

関数の型

英字

英数字

英数字

英数字

日本語

日本語

なお,この組み込み関数は,次のどちらかの場合に使用できる。

-UniObjGenオプションについては,マニュアル「COBOL2002 ユーザーズガイド」またはマニュアル「COBOL2002 使用の手引 手引編」のUnicode機能を参照のこと。

日本語EUC環境については,マニュアル「COBOL2002 使用の手引 手引編」のEUCコードを使用したCOBOLプログラムを参照のこと。

〈この項の構成〉

(1) 一般形式

[図データ]

(2) 引数

  1. 引数1は,字類が英字か英数字,または日本語でなければならない。

  2. 引数1に可変長集団項目を指定してはならない。また,引数1を部分参照してはならない。

  3. 引数1に動的長基本項目を指定してはならない。

  4. 引数1の文字コードは,次のどちらかでなければならない。

    字類

    文字コード

    Unicode機能

    日本語EUC環境

    英字,英数字

    UTF-8

    日本語EUC

    日本語

    UTF-16

  5. 引数2と引数3は,算術式でなければならない。

  6. 引数1,引数2,および引数3に関数一意名およびオブジェクトプロパティは指定できない。なお,引数2および引数3については,算術式中も指定できない。

  7. 引数2および引数3は,ゼロでない正の整数でなければならない。

  8. 引数2および引数3に指定する値は次のとおりとする。

    (ア)見た目幅で部分文字列を返す場合

    半角文字1文字を1,全角文字1文字を2として数えた値を指定する。このとき,同時にWIDTHも指定すること。

    (例)

    文字列'aあc'の見た目幅は4となる。この場合,部分文字列'c'を取得するときは引数2に4,引数3に1を指定する。

    (イ)文字数で部分文字列を返す場合

    半角文字および全角文字の1文字を1として数えた値を指定する。このとき,WIDTHを指定しないこと。

    (例)

    文字列'aあc'の文字数は3となる。この場合,部分文字列'c'を取得するときは引数2に3,引数3に1を指定する。

  9. 引数2で指定する開始位置,または引数2で指定する開始位置から引数3で指定する長さだけ進めた文字位置は,引数1の終端を越えてはならない。

  10. 引数2で指定する開始位置,または引数2で指定する開始位置から引数3で指定する長さだけ進めた文字位置は全角文字の途中を指してはならない。

  11. 引数1が英数字集団項目のとき,その従属項目の字類は英字,または英数字でなければならない。

(3) 関数値

  1. 引数3が指定されている場合,関数値は,引数2,引数3で指定する開始位置と長さで引数1から取り出した部分文字列を返す。このとき,開始位置と長さの単位は次のとおりとする。

    (ア)WIDTHが指定されている場合

    引数2,引数3の単位は見た目幅として開始位置および長さを評価する。

    (イ)WIDTHが指定されていない場合

    引数2,引数3の単位は文字数として開始位置および長さを評価する。

  2. 引数3が指定されていない場合,関数値は,引数2で指定する開始位置から引数1の終端までの部分文字列を返す。このとき,開始位置の単位は次のとおりとする。

    (ア)WIDTHが指定されている場合

    引数2の単位は見た目幅として開始位置を評価する。

    (イ)WIDTHが指定されていない場合

    引数2の単位は文字数として開始位置を評価する。

  3. 関数値を転記する受け取り側作用対象に複数の項目を指定してはならない。

  4. 関数値を受け取る受け取り側のデータ項目が引数1のデータ項目と同じである場合,この関数の実行の結果は保証しない。

  5. 関数値の表現形式は次のとおり。

    (ア)引数1の字類が英字または英数字の場合

    部分文字列の長さの英数字形式。

    (イ)引数1の字類が日本語の場合

    部分文字列の長さの日本語形式。

(4) 使用例(Unicode機能)

SUBSTRING関数を使用して,文字列からある長さの部分文字列を取り出す場合の例について説明する。

英数字項目のときに見た目幅で指定する方法
  • シフトJISの場合

    次の文字列FROMSTR-Xの11文字目から10文字を取り出す文の例を示す。

    [図データ]

    記述例

    [図データ]

  • Unicodeの場合

    見た目幅で指定できるSUBSTRING関数を使用する。SUBSTRING関数を使用して,Unicodeの文字列FROMSTR-Xの11文字目から10文字を取り出す文の例を示す。

    記述例

    [図データ]

日本語項目のときに文字数で指定する方法
  • シフトJISの場合

    次の文字列FROMSTR-Nの4文字目から3文字を取り出す文の例を示す。

    [図データ]

    記述例

    [図データ]

  • Unicodeの場合

    上記の例がUnicodeの場合に,文字数で指定できるSUBSTRING関数を使用して,次の文字列FROMSTR-Nの4文字目から3文字を取り出す例を示す。

    [図データ]

    記述例

    [図データ]

(5) 使用例(日本語EUC環境)

英数字項目から,ある長さの部分文字列を取り出す場合,シフトJISと日本語EUCでは,それぞれ次の例に示すコーディングとなる。

(a) シフトJISでの部分文字列の取り出し

シフトJISの場合,m文字目以降からn文字を取り出す場合,部分参照が使用できる。

(例)文字列FROMSTR-Xの11文字目から10文字取り出し

       01 FROMSTR-X PIC X(100) VALUE 'カナガワケン△△△神奈川県△△'.
                                     *> △:半角空白
                                     *> 神奈川県は,見た目幅2
       01 TOSTR-X PIC X(20).
           :
           MOVE FROMSTR-X(11 : 10) TO TOSTR-X.
           *> 部分参照で,'神奈川県△△'がTOSTR-Xに取得できる

(b) 日本語EUCでの部分文字列の取り出し

日本語EUCの場合,m文字目以降の開始位置が固定ではないため,シフトJISと同じコーディングはできない。そこで,文字数または見た目幅の指定で部分文字列を取り出すSUBSTRING関数を使用する。

(例)文字列FROMSTR-Xの11文字目から10文字取り出し

       01 FROMSTR-X PIC X(100) VALUE 'カナガワケン△△△神奈川県△△'.
                                     *> △:半角空白
                                     *> 神奈川県は,見た目幅2
           :
           MOVE FUNCTION SUBSTRING(FROMSTR-X, 11, 10, WIDTH) TO TOSTR-X.
           *> SUBSTRING関数で,'神奈川県△△'がTOSTR-Xに取得できる

(6) 注意事項

次に示す手続き文の一意名および引数にSUBSTRING関数を指定してはならない。

文/組み込み関数

該当する一意名

DISPLAY文

[書き方3]

DISPLAY 一意名5 〜

UNSTRING文

UNSTRING 一意名1 〜

TRANSFORM文

TRANSFORM 一意名1 FROM 一意名2 TO 一意名3

TRIM関数

FUNCTION TRIM(引数1)

注※

一意名1に関数一意名は指定できない。