EXAMINE

このドキュメントでは、次のトピックについて説明します。

関連ステートメント:ADD | COMPRESS | COMPUTE | DIVIDE | MOVE | MOVE ALL | MULTIPLY | RESET | SEPARATE | SUBTRACT

関連機能グループ:算術演算とデータ移動操作


構文 1 - EXAMINE

EXAMINE [DIRECTION-clause]
  [FULL [VALUE [OF]]]

operand1

  SUBSTRING (operand1,operand2,operand3)
  [POSITION-clause]    
  [FOR] [FULL [VALUE [OF]]] [PATTERN] operand4
  [DELIMITERS-option]

../graphics/cbo3.gif

DELETE-REPLACE-clause

../graphics/cbc3.gif

GIVING-clause
DELETE-REPLACE-clause GIVING-clause

構文図で使用されている記号については、「構文記号」を参照してください。

構文説明 - 構文 1

EXAMINE ステートメントは、英数字やバイナリフィールドの内容、または配列内にあるフィールドの範囲を調べるため、および次の目的で使用します。

  • 検索パターンが見つかった回数を返します。

  • 検索パターンが最初に出現したバイト位置を返します。

  • フィールドの有効な内容の長さ(末尾の空白を除いたフィールド長)を返します。

  • パターンが最初に見つかった配列フィールドのオカレンス番号(インデックス)を返します。

  • パターンを別のパターンで置換します。

  • パターンを削除します。

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1 C* S A     A U         B             ×
operand2 C S           N P I   B *             ×
operand3 C S           N P I   B *             ×
operand4 C S A*     A U         B             ×

GIVING 節を使用する場合、operand1 に定数を指定できます。DELETE または REPLACE 節を使用する場合、定数の指定はできません。

* operand4 は配列としても使用できます(「マルチプルバリューによる検索と置換」を参照)。

* operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

構文要素 説明
DIRECTION-clause
DIRECTION 節:

この節では、検索方向を決めます。詳細については、下記の「DIRECTION 節」を参照してください。

operand1
調べるフィールド:

operand1 では、内容を調べるフィールドを指定します。

operand1DYNAMIC 変数である場合は、REPLACE 操作でフィールドの長さを拡張または縮小できます。また、DELETE 操作で、フィールド長をゼロに設定することもできます。DYNAMIC 変数の現在の長さは、システム変数 *LENGTH を使用して確認できます。

POSITION-clause
POSITION 節:

この節は、operand1(または operand1 のサブストリング)内の調査の開始位置と終了位置を指定するために使用できます。詳細については、下記の「POSITION 節」を参照してください。

operand4
EXAMINE 操作に使用される値:

operand4 は、調べられたフィールドで検索される値です。1 つの値または複数の値を検索できます。

operand4 および operand6 の詳細については、DELETE REPLACE 節で使用される下記の operand6 を参照してください。

FULL
FULL オプション:

オペランドに FULL を指定すると、末尾の空白も含めて値全体が処理されます。FULL を指定しない場合は、オペランド内の末尾の空白は無視されます。

SUBSTRING
SUBSTRING オプション:

通常、フィールドの内容はフィールドの始めから終わりまでまたは空白以外の最後の文字まで調べられます。

SUBSTRING オプションを使用すると、フィールドの特定の部分のみを調べることができます。SUBSTRING 節のフィールド名(operand1)の後に、まず開始位置(operand2)、次に調べるフィールド部分の長さ(operand3)を指定します。

例えば、フィールド #A の 5 番目から 12 番目を調べるには、次のように指定します。

EXAMINE SUBSTRING(#A,5,8).

注意:

  1. operand2 を省略すると、開始位置は 1 とみなされます。
  2. operand3 を省略すると、長さはフィールドの開始位置から終わりまでとみなされます。
  3. SUBSTRINGDYNAMIC 変数と一緒に使用すると、フィールドは固定長変数と同様に動作します。つまり、DELETE または REPLACE 操作が実行されたかどうかに関係なく、EXAMINE 操作の結果として長さ(*LENGTH)が変更されることはありません。
PATTERN
PATTERN オプション:

"ワイルドカード文字"(調べる対象から除外する位置を示す記号)を含む値でフィールドを調べる場合は、PATTERN オプションを使用します。operand4 では、無視する位置に次の記号を挿入できます。

  • ピリオド(.)、疑問符(?)、下線(_)は、調べる対象から除外する位置が単一の位置であることを示します。

  • アスタリスク(*)、パーセント記号(%)は、調べる対象から除外する位置の数がいくつでもよいことを示します。

例:PATTERN 'NAT*AL' で、NATAL を含む、任意の値のフィールドを調べることができます。この場合、NATAL の間は、何文字でも許可されます。つまり、NATURALNATIONALNATAL と同じ結果になります。

DELIMITERS-option
DELIMITERS オプション:

このオプションは、デリミタを示す値を検索するために使用します。詳細については、下記の「DELIMITERS オプション」を参照してください。

DELETE-REPLACE-clause
DELETE-REPLACE 節:

この節の DELETE オプションは、operand1 で見つかった各検索値(operand4)を削除するために使用します。一方、REPLACE オプションは、operand6 で指定した値によって operand1 で見つかった各検索値(operand4)を置換するために使用します。詳細については、下記の「DELETE REPLACE 節」を参照してください。

GIVING-clause 詳細については、下記の「GIVING 節」を参照してください。

DIRECTION 節

方向節では、検索方向を決めます。

 

FORWARD

DIRECTION BACKWARD
  operand8

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand8 C S       A1                       ×

構文要素の説明:

構文要素 説明
FORWARD
左から右の方向で調べる:

FORWARD を指定すると、フィールドの内容は左から右へ向かって調べられます。

BACKWARD
右から左の方向で調べる:

BACKWARD を指定すると、フィールドの内容は右から左へ向かって調べられます。

operand8
代替指定:

operand8 を指定すると、検索方向は operand8 の内容によって決まります。operand8 は、フォーマット/長さ A1 で定義する必要があります。operand8F が含まれている場合、検索方向は FORWARD になります。operand8B が含まれている場合、検索方向は BACKWARD になります。他の値はすべて無効であり、operand8 が定数であればコンパイル時に、operand8 が変数であれば実行時に排除されます。

注意:
DIRECTION 節を指定しない場合、デフォルトの方向は FORWARD になります。

POSITION 節

POSITION 節は、operand1 (または operand1 のサブストリング)内の調査の開始位置と終了位置を指定するために使用できます。

[[STARTING] FROM [POSITION] operand9]

ENDING AT

[POSITION] operand10

THRU

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand9 C S         N P I                 ×
operand10 C S         N P I                 ×

構文要素の説明:

構文要素 説明
FROM operand9
開始位置:

operand9 では、調査の開始位置を指定します。

ENDING AT / THRU operand10
終了位置:

operand10 では、調査の終了位置を指定します。

開始位置(operand9)と終了位置(operand10)は operand1 または operand1 のサブストリングに関連しており、いずれも処理されます。

検索は開始位置から始まり、終了位置で終わります。

開始および(または)終了位置が指定されない場合、デフォルト値が適用されます。この値は、検索方向によって決定されます。

方向 デフォルト開始位置 デフォルト終了位置
FORWARD 1(最初の文字) operand1 の長さ(最後の文字)
BACKWARD operand1 の長さ(最後の文字) 1(最初の文字)

注意:
検索方向が FORWARD で開始位置が終了位置を超えている場合、または検索方向が BACKWARD で開始位置が終了位置未満の場合、検索は実行されません。

DELIMITERS オプション

ABSOLUTE

WITH [DELIMITERS] [operand5]

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand5 C S       A U         B             ×

構文要素の説明:

構文要素 説明
ABSOLUTE
絶対スキャンオプション:

これはデフォルトのオプションです。このオプションを指定すると、値が他のどんな文字に囲まれていても、フィールドに対して指定値の絶対検索が行われます。

WITH DELIMITERS
WITH DELIMITERS オプション:

このオプションは、英数字以外の文字または空白で区切られた値を検索するために使用します。

WITH DELIMITERS operand5
特定のデリミタオプション:

このオプションは、operand5 で指定したいずれかの文字で区切られた値を検索するために使用します。調査したフィールドの先頭または末尾に検索値が見つかった場合は、左右のいずれかの側のみを operand5 の文字で区切る必要があります。

DELETE/REPLACE 節

[AND]

DELETE [FIRST]

REPLACE [FIRST] [WITH] [FULL [VALUE [OF]]] operand6

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand6 C S A*     A  U       B             ×

* operand6 は配列としても使用できます(「マルチプルバリューによる検索と置換」を参照)。

構文要素の説明:

構文要素 説明
DELETE
DELETE オプション:

このオプションは、operand1 の内容から、検索値(operand4)の最初(またはすべて)のオカレンスを削除するために使用します。

REPLACE
REPLACE オプション:

このオプションは、operand1 にある検索値(operand4)の最初(またはすべて)のオカレンスを operand6 で指定した値に置換するために使用します。

FIRST
FIRST オプション:

キーワード FIRST を指定すると、最初の同じ値のみを削除または置換できます。

注意:

  1. REPLACE 操作の結果が operand1 に入り切らない場合は、エラーメッセージが返されます。
  2. operand1 がダイナミック変数である場合は、REPLACE 操作でフィールドの長さを拡張または縮小できます。また、DELETE 操作で、フィールド長をゼロに設定することもできます。ダイナミック変数の現在の長さは、システム変数 *LENGTH を使用して確認できます。ダイナミック変数の一般的な情報については、「ダイナミック変数の使用」を参照してください。

検索して複数の値に置き換える

検索(operand4)および置換値(operand6)は配列フィールドとして定義することもできます。これにより、調査したフィールド(operand1)内の複数の異なるパターンを、すべて固有の EXAMINE ステートメントに置き換えることができます。検索オペランドと置換オペランドのオカレンス数が同じである必要はありません。必要になるのは、これらのフィールド間の転送の互換性のみです。つまり、operand4:=operand6 が有効な操作である必要があります。『プログラミングガイド』の「配列の割り当て操作」を参照してください。

マルチプルバリュー検索の操作ロジックは次のとおりです。

  • 調査するフィールド(operand1)は、方向 FORWARD は左から右に、方向 BACKWARD は右から左に一度だけ渡されます。

  • 最初の位置から開始し、検索配列(operand4)内の値が一致しているかどうかが、最も低いインデックスを持つ配列オカレンスから順にテストされます。

  • 検索値が見つからなかった場合は、次のフィールド位置で比較が繰り返されます。

  • 検索されたパターンのいずれかが、調査したフィールド(operand1)で検出された場合は、置換配列(operand6)の値に置き換えられ、operand4:=operand6 が実行される場合は、operand4 の一致パターンがオーバーレイされます。

  • パターンの置換が実行された後、挿入された値の直後で、比較プロセスが検索配列の最初のオカレンスから続行されます。つまり、置換されたパターンはスキップされ、2 回目に置換されない可能性があります。

例:

この例では、より小文字(<)、より大文字(>)、およびアンパサンド文字(&)に対する HTML 変換を示します。

DEFINE DATA LOCAL
1 #HTML  (A/1:3) DYNAMIC INIT <'&lt;','&gt;','&amp;'>  
1 #TAB   (A/1:3) DYNAMIC INIT <'<','>','&'>
1 #DOC(A) DYNAMIC  /* document to be replaced 
END-DEFINE
#DOC := 'a&lt;&lt;b&amp;b&gt;c&gt;'
WRITE #DOC (AL=30) 'before'
/* Replace #DOC using #HTML to #TAB (n:1 replacement)
EXAMINE   #DOC FOR  #HTML(*)  REPLACE  #TAB(*)  
/* '&lt;'  is replaced by '<'  (4:1 replacement)
/* '&gt;'  is replaced by '>'  (4:1 replacement)
/* '&amp;' is replaced by '&'  (5:1 replacement)
WRITE #DOC (AL=30) 'after'
END

例 3 - マルチプルバリューによる調査と置換」も参照してください。

GIVING 節

GIVING [IN] operand7

[GIVING] NUMBER [IN] operand7
[[GIVING] POSITION [IN] operand7]
[[GIVING] LENGTH [IN] operand7]
[[GIVING] INDEX [IN] operand7 ...3]

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand7   S         N P I                

構文要素の説明:

構文要素 説明
GIVING
GIVING 節:

キーワード GIVING だけを指定した場合、これは GIVING NUMBER(デフォルト)に相当します。

NUMBER
GIVING NUMBER 節:

内容を調べるフィールド(operand1)で検索値(operand4)が見つかった回数を取得するために使用します。

POSITION
GIVING POSITION 節:

operand1(または operand1 のサブストリング)内で operand4 と同じ値が初めて出現したバイト位置を取得するために使用します。

LENGTH
GIVING LENGTH 節:

すべての削除または置換操作が完了した後の operand1(または operand1 のサブストリング)に残っている内容の長さを取得するために使用します。末尾にある空白は無視されます。

operand7
オカレンス数:

検索値のオカレンス数を指定します。REPLACE FIRST または DELETE FIRST オプションを同時に使用する場合は、1 を超えないようにする必要があります。

INDEX operand7 ...3
GIVING INDEX 節:

このオプションは、調べられる基礎のフィールドが配列フィールドの場合にのみ適用できます。

GIVING INDEX は、最初の検索値(operand4)が見つかった operand1 の配列オカレンス番号(インデックス)を取得するために使用します。

operand1 の数(最大 3 個)は、 operand7 の次元数と一致させる必要があります。operand7 には、検索値がどのオカレンスでも見つからなかった場合、0が入ります。

注意:
operand1 のインデックス範囲にオカレンス 00:5 など)が含まれている場合、operand70 値は正確ではありません。この場合、GIVING NUMBER 節を追加して検索値が実際に見つかったかどうかを明確にする必要があります。

構文 2 - EXAMINE TRANSLATE

EXAMINE

operand1

[AND]
SUBSTRING (operand1,operand2,operand3)
    TRANSLATE

INTO

UPPER

[CASE]

 
    LOWER  
    USING [INVERTED] operand4  

構文図で使用されている記号については、「構文記号」を参照してください。

構文説明 - 構文 2

EXAMINE TRANSLATE ステートメントでは、フィールド内の文字を大文字や小文字、または他の文字に変換します。

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1   S A     A U         B             ×
operand2 C S           N P I   B *             ×
operand3 C S           N P I   B *             ×
operand4   S A     A U         B             ×

* operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

構文要素 説明
EXAMINE operand1
フィールド内容の全体の変換:

operand1 で指定したフィールドの内容が変換されます。

EXAMINE SUBSTRING operand1 operand2 operand3
フィールド内容の一部分の変換:

通常は、フィールドの内容全体が変換されます。

SUBSTRING オプションを指定すると、フィールドの特定の部分のみが変換されます。SUBSTRING 節のフィールド名(operand1)の後に、まず開始位置(operand2)、次に調べるフィールド部分の長さ(operand3)を指定します。

例えば、フィールド #A の 5 番目から 12 番目を変換する場合は、次のように指定します。

EXAMINE SUBSTRING(#A,5,8) AND TRANSLATE ...

注意:
operand2 を省略すると、開始位置は 1 とみなされます。operand3 を省略すると、長さはフィールドの開始位置から終わりまでとみなされます。

TRANSLATE INTO UPPER CASE
大文字変換:

operand1 の内容が大文字に変換されます。

TRANSLATE INTO LOWER CASE
小文字変換:

operand1の内容が小文字に変換されます。

TRANSLATE USING operand4
変換テーブル:

operand4 は、文字変換に使用する変換テーブルです。テーブルのフォーマット/長さは、A2、U2 または B2 にする必要があります。

注意:
変換される文字に対して変換テーブルで複数の変換が定義されている場合は、最後の変換が適用されます。

INVERTED
INVERTED オプション:

キーワード INVERTED を指定すると、変換テーブル(operand4)は逆に使用されます。つまり、変換の方向が逆転します。

構文 3 - Unicode 書記素用の EXAMINE

EXAMINE [FULL [VALUE [OF]]]

operand1
SUBSTRING (operand1,operand2,operand3)

[POSITION-clause]  
[FOR]

CHARPOSITIONoperand4 CHARLENGTHoperand5
CHARPOSITIONoperand4
CHARLENGTHoperand5

[GIVING] POSITION [IN] operand6 [GIVING] LENGTH [IN] operand7

[GIVING] POSITION [IN] operand6
[GIVING] LENGTH [IN] operand7

構文図で使用されている記号については、「構文記号」を参照してください。

構文説明 - 構文 3

"grapheme" は、ユーザーが一般に文字と見なすものです。ほとんどの場合、UTF-16 コード単位(= U 形式文字)が書記素になりますが、書記素は複数のコード単位で構成されることもあります。例えば、一連の基本文字の後に、結合文字またはサロゲートペアが続きます。書記素および他の Unicode 用語の詳細については、http://www.unicode.org/ の『The Unicode Standard』を参照してください。

U 形式オペランド用の EXAMINE ステートメントは、通常、コード単位に対して機能します。ただし、CHARPOSITION および CHARLENGTH 節を使用している場合は、書記素シーケンスの開始位置と長さ(コード単位での)を取得できます。返されるコード単位の値は、コード単位のオペランドを必要とする他のステートメントまたは節で使用できます(例:SUBSTRING 節)。

EXAMINE ステートメントのこの構文に関する詳細については、「Natural プログラミング言語での Unicode およびコードページのサポート」の「ステートメント」セクション、「EXAMINE」も参照してください。

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1 C S A     U                       ×
operand2 C S         N P I   B *             ×
operand3 C S         N P I   B *             ×
operand4 C S         N P I                 ×
operand5 C S         N P I                 ×
operand6   S         N P I                 ×
operand7   S         N P I                 ×

* operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

構文要素 説明
FULL
FULL オプション:

オペランドに FULL を指定すると、末尾の空白も含めて値全体が処理されます。FULL を指定しない場合は、オペランド内の末尾の空白は無視されます。

SUBSTRINGoperand1 operand2 operand3
SUBSTRING 節:

通常、フィールドの内容はフィールドの始めから終わりまでまたは空白以外の最後の文字まで調べられます。

SUBSTRING オプションを使用すると、フィールドの特定の部分のみを調べることができます。SUBSTRING 節のフィールド名(operand1)の後に、まず開始位置(operand2)、次に調べるフィールド部分の長さ(operand3)を指定します。operand2operand3 は、コード単位で指定します。

例えば、フィールド #A の 5 番目から 12 番目を調べるには、次のように指定します。

EXAMINE SUBSTRING(#A、5、8)

注意:

  1. operand2 を省略すると、開始位置は 1 とみなされます。
  2. operand3 を省略すると、長さはフィールドの開始位置から終わりまでとみなされます。
  3. SUBSTRINGDYNAMIC 変数と一緒に使用すると、フィールドは固定長変数と同様に動作します。つまり、DELETE または REPLACE 操作が実行されたかどうかに関係なく、EXAMINE 操作の結果として長さ(*LENGTH)が変更されることはありません。
POSITION-clause
POSITION 節:

FROMTHRU の位置は、コード単位で与えられます。詳細については、「構文 1」の POSITION 節 を参照してください。

CHARPOSITION operand4
CHARPOSITION 節:

operand4 では、書記素シーケンスの開始位置(Unicode 書記素)を定義します。対応する位置(コード単位)が、operand6 で返されます。CHARLENGTH 節が指定されている場合は、この節を省略できます。その場合、開始位置は 1 とみなされます。

CHARLENGTH operand5
CHARLENGTH 節:

operand5 では、書記素シーケンスの長さ(Unicode 書記素)を定義します。書記素シーケンスの長さ(コード単位)が、operand7 で返されます。CHARPOSITION 節が指定されている場合は、この節を省略できます。その場合は、開始位置から文字列の末尾までの長さが返されます。

GIVING POSITION IN operand6
GIVING POSITION 節:

operand6 は、operand4operand5 によって定義された書記素シーケンスの開始位置(コード単位)を受け取ります。operand1operand4 書記素よりも小さい場合は、0 が返されます。GIVING LENGTH 節が指定されている場合は、この節を省略できます。

GIVING LENGTH IN operand7
GIVING LENGTH 節:

operand7 は、operand4operand5 によって定義された書記素シーケンスの長さ(コード単位)を受け取ります。operand1operand4+operand5 書記素よりも小さい場合は、0 が返されます。GIVING POSITION 節が指定されている場合は、この節を省略できます。

注意:

  1. CHARPOSITIONCHARLENGTH 節の一方または両方を指定する必要があります。
  2. GIVING POSITIONGIVING LENGTH 節の一方または両方を指定する必要があります。

例 1 - EXAMINE

** Example 'EXMEX1': EXAMINE                                            
************************************************************************
DEFINE DATA LOCAL                                                       
1 #TEXT   (A45)                                                         
1 #ARRAY  (A5/1:3)                                                      
1 #A      (A3)                                                          
1 #START  (N2)                                                          
1 #NUM    (N2)                                                          
1 #NUM1   (N2)                                                          
1 #NUM2   (N2)                                                          
1 #NUM3   (N2)                                                          
1 #POS    (N2)                                                          
1 #POS1   (N2)                                                          
1 #LENG   (N2)                                                          
1 #INDEX  (N2)                                                          
END-DEFINE                                                              
*                                                                       
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT           
*                                                                       
WRITE / 'EXAMPLE 1  (DELIMITER, GIVING NUMBER)'                         
WRITE NOTITLE '#TEXT: ' #TEXT                                           
EXAMINE #TEXT FOR 'A' GIVING NUMBER #NUM1                               
EXAMINE #TEXT FOR 'A' WITH DELIMITER GIVING NUMBER #NUM2                
EXAMINE #TEXT FOR 'A' WITH DELIMITER '.' GIVING NUMBER #NUM3            
WRITE 'EXAMINE #TEXT FOR "A" ' 57T 'Number found:' #NUM1                
WRITE 'EXAMINE #TEXT FOR "A" WITH DELIMITER' 57T 'Number found:' #NUM2  
WRITE 'EXAMINE #TEXT FOR "A" WITH DELIMITER "."'                        
  57T 'Number found:' #NUM3                                             
*                                                                       
WRITE / 'EXAMPLE 2  (DELIMITER, REPLACE, GIVING NUMBER)'                
WRITE 'EXAMINE #TEXT FOR "A" WITH DELIMITER "-" REPLACE WITH "*"'       
WRITE 'Before:' #TEXT                                                   
EXAMINE #TEXT FOR 'A' WITH DELIMITER '-' REPLACE WITH '*'               
        GIVING NUMBER #NUM                                              
WRITE 'After: ' #TEXT 57T 'Number found:' #NUM                          
*                                                                       
*                                                                       
NEWPAGE                                                                 
*                                                                       
WRITE / 'EXAMPLE 3  (REPLACE, GIVING NUMBER)'                           
WRITE 'EXAMINE      #TEXT FOR " " REPLACE WITH "+"'                     
WRITE 'Before:' #TEXT                                                   
EXAMINE #TEXT FOR ' ' REPLACE WITH '+' GIVING NUMBER #NUM               
WRITE 'After: ' #TEXT 57T 'Number found:' #NUM                          
*                                                                       
WRITE / 'EXAMPLE 4  (FULL, REPLACE, GIVING NUMBER)'                     
WRITE 'EXAMINE FULL #TEXT FOR " " REPLACE WITH "+"'                     
WRITE 'Before:' #TEXT                                                   
EXAMINE FULL #TEXT FOR ' ' REPLACE WITH '+' GIVING NUMBER #NUM          
WRITE 'After: ' #TEXT 57T 'Number found:' #NUM                          
*                                                                       
WRITE / 'EXAMPLE 5  (DELETE, GIVING POSITION)'                          
WRITE 'EXAMINE #TEXT FOR "+" DELETE GIVING POSITION #POS'               
WRITE 'Before:' #TEXT                                                   
EXAMINE #TEXT FOR '+' DELETE GIVING POSITION #POS                       
WRITE 'After: ' #TEXT 57T 'Position found:' #POS                        
*                                                                       
WRITE / 'EXAMPLE 6  (DELETE, GIVING LENGTH)'                            
WRITE 'EXAMINE #TEXT FOR "A" DELETE GIVING LENGTH #LENG'                
WRITE 'Before:' #TEXT                                                   
EXAMINE #TEXT FOR 'A' DELETE GIVING LENGTH #LENG                        
WRITE 'After: ' #TEXT 57T 'Length found:' #LENG                         
*                                                                       
*                                                                       
NEWPAGE                                                                 
*                                                                       
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT           
*                                                                       
WRITE / 'EXAMPLE 7  (PATTERN, REPLACE, GIVING NUMBER)'                  
WRITE 'EXAMINE #TEXT FOR         ".A." AND REPLACE "***"'               
WRITE 'Before:' #TEXT                                                   
EXAMINE #TEXT FOR         '.A.' AND REPLACE '***' GIVING NUMBER #NUM    
WRITE 'After: ' #TEXT 57T 'Number found:' #NUM                          
*                                                                       
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT           
*                                                                       
WRITE 'EXAMINE #TEXT FOR PATTERN ".A." AND REPLACE "***"'               
WRITE 'Before:' #TEXT                                                   
EXAMINE #TEXT FOR PATTERN '.A.' AND REPLACE '***' GIVING NUMBER #NUM    
WRITE 'After: ' #TEXT 57T 'Number found:' #NUM                          
*                                                                       
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT           
*                                                                       
#A   := 'B C'                                                           
#POS := 6                                                               
#LENG:= 25                                                              
*                                                                       
WRITE / 'EXAMPLE 8  (SUBSTRING, REPLACE, GIVING POSITION)'              
WRITE '#A := "B C" ; #POS := 6 ; #LENG:= 25 '                           
WRITE 'EXAMINE SUBSTRING(#TEXT,#POS,#LENG) FOR #A AND REPLACE "***"'    
WRITE 'Before:' #TEXT                                                   
EXAMINE SUBSTRING(#TEXT,#POS,#LENG) FOR #A AND REPLACE '***'            
        GIVING POSITION #POS1                                           
WRITE 'After: ' #TEXT 57T 'Position found:' #POS1                       
*                                                                       
*                                                                       
NEWPAGE                                                                 
*                                                                       
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT           
*                                                                       
WRITE / 'EXAMPLE 9  (DELETE, GIVING NUMBER, GIVING POSITION, '-         
        'GIVING LENGTH)'                                                
WRITE 'EXAMINE #TEXT FOR "." DELETE GIVING NUMBER   #NUM'               
WRITE 30T 'GIVING POSITION #POS'                                        
WRITE 30T 'GIVING LENGTH   #LENG'                                       
WRITE 'Before:' #TEXT                                                   
EXAMINE #TEXT FOR '.' DELETE GIVING NUMBER #NUM                         
                             GIVING POSITION #POS                              
                             GIVING LENGTH   #LENG                             
WRITE 'After: ' #TEXT                                                   
WRITE 'Number found:  ' #NUM                                            
WRITE 'Position found:' #POS                                            
WRITE 'Length found:  ' #LENG                                           
*                                                                       
*                                                                       
*                                                                       
MOVE 'ABC  ' TO #ARRAY (1)                                              
MOVE '.A.B.' TO #ARRAY (2)                                              
MOVE '-A-B-' TO #ARRAY (3)                                              
*                                                                       
WRITE / 'EXAMPLE 10 (GIVING NUMBER, GIVING POSITION, GIVING INDEX)'     
WRITE '#ARRAY(1):' #ARRAY(1)                                            
WRITE '#ARRAY(2):' #ARRAY(2)                                            
WRITE '#ARRAY(3):' #ARRAY(3)                                            
WRITE 'EXAMINE #ARRAY(*) FOR "B" GIVING NUMBER   #NUM'                  
WRITE 27T 'GIVING POSITION #POS'                                        
WRITE 27T 'GIVING INDEX    #INDEX'                                      
EXAMINE #ARRAY(*) FOR 'B' GIVING NUMBER   #NUM                          
                          GIVING POSITION #POS                          
                          GIVING INDEX    #INDEX                        
WRITE 'Number found:  ' #NUM                                            
WRITE 'Position found:' #POS                                            
WRITE 'Index found:   ' #INDEX                                          
END

プログラム EXMEX1 の出力:

EXAMPLE 1  (DELIMITER, GIVING NUMBER)                                     
#TEXT:  ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-                      
EXAMINE #TEXT FOR 'A'                                   Number found:   4 
EXAMINE #TEXT FOR 'A' WITH DELIMITER                    Number found:   3 
EXAMINE #TEXT FOR 'A' WITH DELIMITER '.'                Number found:   1 
                                                                          
EXAMPLE 2  (DELIMITER, REPLACE, GIVING NUMBER)                            
EXAMINE #TEXT FOR 'A' WITH DELIMITER '-' REPLACE WITH '*'                 
Before: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-                      
After:  ABC   A B C   .A.  .B.  .C.    -*-  -B-  -C-    Number found:   1 

EXAMPLE 3  (REPLACE, GIVING NUMBER)                                         
EXAMINE      #TEXT FOR ' ' REPLACE WITH '+'                                 
Before: ABC   A B C   .A.  .B.  .C.    -*-  -B-  -C-                        
After:  ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-++-C-    Number found:  20   
                                                                            
EXAMPLE 4  (FULL, REPLACE, GIVING NUMBER)                                   
EXAMINE FULL #TEXT FOR ' ' REPLACE WITH '+'                                 
Before: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-++-C-                        
After:  ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-++-C-+   Number found:   1   
                                                                            
EXAMPLE 5  (DELETE, GIVING POSITION)                                        
EXAMINE #TEXT FOR '+' DELETE GIVING POSITION #POS                           
Before: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-++-C-+                       
After:  ABCABC.A..B..C.-*--B--C-                        Position found:   4 
                                                                            
EXAMPLE 6  (DELETE, GIVING LENGTH)                                          
EXAMINE #TEXT FOR 'A' DELETE GIVING LENGTH #LENG                            
Before: ABCABC.A..B..C.-*--B--C-                                            
After:  BCBC...B..C.-*--B--C-                           Length found:  21   

EXAMPLE 7  (PATTERN, REPLACE, GIVING NUMBER)                                
EXAMINE #TEXT FOR         '.A.' AND REPLACE '***'                           
Before: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-                        
After:  ABC   A B C   ***  .B.  .C.    -A-  -B-  -C-    Number found:   1   
EXAMINE #TEXT FOR PATTERN '.A.' AND REPLACE '***'                           
Before: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-                        
After:  ABC  ***B C   ***  .B.  .C.    ***  -B-  -C-    Number found:   3   
                                                                            
EXAMPLE 8  (SUBSTRING, REPLACE, GIVING POSITION)                            
#A := 'B C' ; #POS := 6 ; #LENG:= 25                                        
EXAMINE SUBSTRING(#TEXT,#POS,#LENG) FOR #A AND REPLACE '***'                
Before: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-                        
After:  ABC   A ***   .A.  .B.  .C.    -A-  -B-  -C-    Position found:   4 

EXAMPLE 9  (DELETE, GIVING NUMBER, GIVING POSITION, GIVING LENGTH)
EXAMINE #TEXT FOR '.' DELETE GIVING NUMBER   #NUM                 
                             GIVING POSITION #POS                 
                             GIVING LENGTH   #LENG                
Before: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-              
After:  ABC   A B C   A  B  C    -A-  -B-  -C-                    
Number found:     6                                               
Position found:  15                                               
Length found:    38                                               
                                                                  
EXAMPLE 10 (GIVING NUMBER, GIVING POSITION, GIVING INDEX)         
#ARRAY(1): ABC                                                    
#ARRAY(2): .A.B.                                                  
#ARRAY(3): -A-B-                                                  
EXAMINE #ARRAY(*) FOR 'B' GIVING NUMBER   #NUM                    
                          GIVING POSITION #POS                    
                          GIVING INDEX    #INDEX                  
Number found:     3                                               
Position found:   2                                               
Index found:      1

例 2 - EXAMINE TRANSLATE

** Example 'EXMEX2': EXAMINE TRANSLATE                                  
************************************************************************
DEFINE DATA LOCAL                                                       
1 #TEXT  (A50)                                                          
1 #TAB   (A2/1:10)                                                      
1 #POS   (N2)                                                           
1 #LENG  (N2)                                                           
END-DEFINE                                                              
*                                                                       
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT           
*                                                                       
MOVE 'AX' TO #TAB(1)                                                    
MOVE 'BY' TO #TAB(2)                                                    
MOVE 'CZ' TO #TAB(3)                                                    
*                                                                       
*                                                                       
WRITE NOTITLE / 'EXAMPLE 1  (WITH TRANSLATION TABLE)'                   
WRITE 'EXAMINE #TEXT TRANSLATE USING #TAB(*)'                           
WRITE 'Before:' #TEXT                                                   
EXAMINE #TEXT TRANSLATE USING #TAB(*)    
WRITE 'After: ' #TEXT                                                   
*                                                                       
WRITE / 'EXAMPLE 2  (WITH INVERTED TRANSLATION TABLE)'                  
WRITE 'EXAMINE #TEXT TRANSLATE USING INVERTED #TAB(*)'                  
WRITE 'Before:' #TEXT                                                   
EXAMINE #TEXT TRANSLATE USING INVERTED #TAB(*)
WRITE 'After: ' #TEXT                                                
*                                                                    
#POS := 13                                                           
#LENG:= 15                                                           
*                                                                    
WRITE / 'EXAMPLE 3  (WITH LOWER CASE TRANSLATION)'                   
WRITE '#POS := 13 ; #LENG:= 15 '                                     
WRITE 'EXAMINE SUBSTRING(#TEXT,#POS,#LENG) TRANSLATE INTO LOWER CASE'
WRITE 'Before:' #TEXT                             
EXAMINE SUBSTRING(#TEXT,#POS,#LENG) TRANSLATE INTO LOWER CASE
WRITE 'After: ' #TEXT
*                    
END

プログラム EXMEX2 の出力:

EXAMPLE 1  (WITH TRANSLATION TABLE)                           
EXAMINE #TEXT TRANSLATE USING #TAB(*)                         
Before: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-          
After:  XYZ   X Y Z   .X.  .Y.  .Z.    -X-  -Y-  -Z-          
                                                              
EXAMPLE 2  (WITH INVERTED TRANSLATION TABLE)                  
EXAMINE #TEXT TRANSLATE USING INVERTED #TAB(*)                
Before: XYZ   X Y Z   .X.  .Y.  .Z.    -X-  -Y-  -Z-          
After:  ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-          
                                                              
EXAMPLE 3  (WITH LOWER CASE TRANSLATION)                      
#POS := 13 ; #LENG:= 15                                       
EXAMINE SUBSTRING(#TEXT,#POS,#LENG) TRANSLATE INTO LOWER CASE 
Before: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-          
After:  ABC   A B C   .a.  .b.  .c.    -A-  -B-  -C-

例 3 - マルチプルバリューによる調査と置換

*  EXAMPLE 'EXMEX3': EXAMINE AND REPLACE WITH MULTIPLE VALUES                      
************************************************************************           
* This example shows a translation of the pattern                                  
* 'AA', 'Aa' and 'aA' into '++',                                                   
* 'BB', 'Bb' and 'bB' into '--' and                                                
* 'CC', 'Cc' and 'cC' into '**'.                                                   
************************************************************************           
DEFINE DATA LOCAL                                                                  
1 #SV     (A2/1:3,1:3) INIT (1,V) <'AA','BB','CC'>                           
                            (2,V) <'Aa','Bb','Cc'>                           
                            (3,V) <'aA','bB','cC'>                           
1 #RV     (A2/1:3)     INIT       <'++','--','**'>                           
1 #STRING (A20)        INIT <'AAABbbbbBCCCcccCaaaA'>                         
1 #NUM    (N2)                                                                     
END-DEFINE                                                                         
*                                                                                  
*                                                                                  
WRITE NOTITLE / 'EXAMINE #STRING FOR #SV(*,*) AND REPLACE WITH #RV(*)' /           
*                                                                                  
WRITE 'Before:' #STRING   /* shows   'AAABbbbbBCCCcccCaaaA'                        
*                                                                                  
EXAMINE #STRING FOR #SV(*,*) AND REPLACE WITH #RV(*)
        GIVING NUMBER #NUM                          
*                                                                                  
WRITE 'After: ' #STRING   /* shows   '++A--bb--****c**aa++'                        
  40T 'Number found:' #NUM                                                         
*

プログラム EXMEX3 の出力:

EXAMINE #STRING FOR #SV(*,*) AND REPLACE WITH #RV(*)     
                                                         
Before: AAABbbbbBCCCcccCaaaA                             
After:  ++A--bb--****c**aa++           Number found:   7

例 4 - Unicode 書記素用の EXAMINE

この例では、文字 äü を含む Unicode 文字列の分析を示します。この 2 つの文字は基本文字として定義され、その後に結合文字が続きます。äU+0061 で、その後に U+0308 が続きます。また、üU+0075 で、その後に U+0308 が続きます。

DEFINE DATA LOCAL                                         
1 #U (U20)                                                
1 #START (I2)                                             
1 #POS (I2)                                               
1 #LEN (I2)                                               
END-DEFINE                                                
#U := U'AB'-UH'00610308'-U'CD'-UH'00750308'-U'EF'         
*                                                         
REPEAT                                                    
  #START := #START + 1                                    
  EXAMINE #U FOR CHARPOSITION #START                      
                   CHARLENGTH      1                      
              GIVING POSITION IN #POS                     
                       LENGTH IN #LEN                     
*                                                         
  INPUT (AD=O) MARK POSITION #POS IN FIELD *#U            
    '         UNICODE-STRING:' #U     (AD=MI)             
 // '          CHARACTER NO.:' #START (EM=9)              
  / 'STARTS AT BYTE POSITION:' #POS   (EM=9)              
  / '      AND THE LENGTH IS:' #LEN   (EM=9)              
WHILE #POS NE 0                                           
END-REPEAT                                                
END

出力:

メインフレーム環境: Windows、UNIX、および OpenVMS 環境(Natural Web I/O インターフェイスでの出力):
UNICODE-STRING:ABa?CDu?EF

          文字番号:1
STARTS AT BYTE POSITION: 1
      AND THE LENGTH IS: 1
UNICODE-STRING:ABäCDüEF

          文字番号:1
STARTS AT BYTE POSITION: 1
      AND THE LENGTH IS: 1
ENTER キーを押して次に進みます。 ENTER キーを押して次に進みます。
UNICODE-STRING:ABa?CDu?EF

          文字番号:2
STARTS AT BYTE POSITION: 2
      AND THE LENGTH IS: 1
UNICODE-STRING:ABäCDüEF

          文字番号:2
STARTS AT BYTE POSITION: 2
      AND THE LENGTH IS: 1
ENTER キーを押して次に進みます。 ENTER キーを押して次に進みます。
位置 3 にある文字は結合文字シーケンスで、コード単位 2 個分の長さがあることに注意してください。
UNICODE-STRING:AB<b>a</b>?CDu?EF

          文字番号:3
STARTS AT BYTE POSITION: 3
      AND THE LENGTH IS: 2
UNICODE-STRING:AB<b>ä</b>CDüEF

          文字番号:3
STARTS AT BYTE POSITION: 3
      AND THE LENGTH IS: 2
以下、同様。 以下、同様。