このドキュメントでは、次のトピックについて説明します。
関連ステートメント:ADD | COMPRESS | COMPUTE | DIVIDE | MOVE | MOVE ALL | MULTIPLY | RESET | SEPARATE | SUBTRACT
関連機能グループ:算術演算とデータ移動操作
EXAMINE |
[DIRECTION-clause] | |||||
[FULL [VALUE [OF]]]
|
|
operand1 |
|
|||
SUBSTRING (operand1,operand2,operand3)
|
||||||
| [POSITION-clause] | ||||||
[FOR] [FULL [VALUE [OF]]] [PATTERN] operand4 |
||||||
| [DELIMITERS-option] | ||||||
|
|
DELETE-REPLACE-clause |
|
||||
| GIVING-clause | ||||||
| DELETE-REPLACE-clause GIVING-clause | ||||||
構文図で使用されている記号については、「構文記号」を参照してください。
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 |
調べるフィールド:
|
POSITION-clause |
POSITION 節:
この節は、 |
operand4 |
EXAMINE 操作に使用される値:
|
FULL |
FULL オプション:
オペランドに |
SUBSTRING |
SUBSTRING オプション:
通常、フィールドの内容はフィールドの始めから終わりまでまたは空白以外の最後の文字まで調べられます。
例えば、フィールド #A の 5 番目から 12 番目を調べるには、次のように指定します。 EXAMINE SUBSTRING(#A,5,8). 注意:
|
PATTERN |
PATTERN オプション:
"ワイルドカード文字"(調べる対象から除外する位置を示す記号)を含む値でフィールドを調べる場合は、
例: |
DELIMITERS-option |
DELIMITERS オプション:
このオプションは、デリミタを示す値を検索するために使用します。詳細については、下記の「DELIMITERS オプション」を参照してください。 |
DELETE-REPLACE-clause |
DELETE-REPLACE 節:
この節の |
GIVING-clause |
詳細については、下記の「GIVING 節」を参照してください。 |
方向節では、検索方向を決めます。
|
|
FORWARD |
|
|
DIRECTION |
BACKWARD |
||
| operand8 |
| オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand8 |
C | S | A1 | ○ | × | ||||||||||||||
構文要素の説明:
注意:DIRECTION 節を指定しない場合、デフォルトの方向は FORWARD になります。
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 |
開始位置:
|
ENDING AT / THRU
operand10
|
終了位置:
|
開始位置(operand9)と終了位置(operand10)は operand1 または operand1 のサブストリングに関連しており、いずれも処理されます。
検索は開始位置から始まり、終了位置で終わります。
開始および(または)終了位置が指定されない場合、デフォルト値が適用されます。この値は、検索方向によって決定されます。
| 方向 | デフォルト開始位置 | デフォルト終了位置 |
|---|---|---|
FORWARD |
1(最初の文字) | operand1 の長さ(最後の文字)
|
BACKWARD |
operand1 の長さ(最後の文字)
|
1(最初の文字) |
注意:
検索方向が FORWARD で開始位置が終了位置を超えている場合、または検索方向が BACKWARD で開始位置が終了位置未満の場合、検索は実行されません。
|
|
ABSOLUTE |
|
WITH
[DELIMITERS] [operand5] |
オペランド定義テーブル:
| オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand5 |
C | S | A | U | B | ○ | × | |||||||||||||
構文要素の説明:
[AND]
|
|
DELETE [FIRST]
|
|
REPLACE [FIRST] [WITH] [FULL [VALUE [OF]]] operand6 |
オペランド定義テーブル:
| オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand6 |
C | S | A* | A | U | B | ○ | × | |||||||||||
* operand6 は配列としても使用できます(「マルチプルバリューによる検索と置換」を参照)。
構文要素の説明:
| 構文要素 | 説明 |
|---|---|
DELETE |
DELETE オプション:
このオプションは、 |
REPLACE |
REPLACE オプション:
このオプションは、 |
FIRST |
FIRST オプション:
キーワード |
注意:
REPLACE 操作の結果が operand1 に入り切らない場合は、エラーメッセージが返されます。
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 <'<','>','&'> 1 #TAB (A/1:3) DYNAMIC INIT <'<','>','&'> 1 #DOC(A) DYNAMIC /* document to be replaced END-DEFINE #DOC := 'a<<b&b>c>' WRITE #DOC (AL=30) 'before' /* Replace #DOC using #HTML to #TAB (n:1 replacement) EXAMINE #DOC FOR #HTML(*) REPLACE #TAB(*) /* '<' is replaced by '<' (4:1 replacement) /* '>' is replaced by '>' (4:1 replacement) /* '&' is replaced by '&' (5:1 replacement) WRITE #DOC (AL=30) 'after' END
「例 3 - マルチプルバリューによる調査と置換」も参照してください。
|
|
|
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 節:
キーワード |
NUMBER |
GIVING NUMBER 節:
内容を調べるフィールド( |
POSITION |
GIVING POSITION 節:
|
LENGTH |
GIVING LENGTH 節:
すべての削除または置換操作が完了した後の |
operand7 |
オカレンス数:
検索値のオカレンス数を指定します。 |
INDEX
operand7 ...3 |
GIVING INDEX 節:
このオプションは、調べられる基礎のフィールドが配列フィールドの場合にのみ適用できます。
operand1 の数(最大 3 個)は、 注意: |
EXAMINE |
|
operand1 |
|
[AND]
|
||||||
SUBSTRING |
(operand1,operand2,operand3) | |||||||||
TRANSLATE |
|
INTO |
|
UPPER |
|
[CASE]
|
|
|||
LOWER |
||||||||||
USING [INVERTED] operand4 |
||||||||||
構文図で使用されている記号については、「構文記号」を参照してください。
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 |
フィールド内容の全体の変換:
|
EXAMINE SUBSTRING operand1
operand2
operand3
|
フィールド内容の一部分の変換:
通常は、フィールドの内容全体が変換されます。
例えば、フィールド EXAMINE SUBSTRING(#A,5,8) AND TRANSLATE ... 注意: |
TRANSLATE INTO UPPER CASE |
大文字変換:
|
TRANSLATE INTO LOWER CASE |
小文字変換:
|
TRANSLATE USING
operand4 |
変換テーブル:
注意: |
INVERTED |
INVERTED オプション:
キーワード |
構文図で使用されている記号については、「構文記号」を参照してください。
"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 オプション:
オペランドに |
SUBSTRINGoperand1
operand2
operand3 |
SUBSTRING 節:
通常、フィールドの内容はフィールドの始めから終わりまでまたは空白以外の最後の文字まで調べられます。
例えば、フィールド EXAMINE SUBSTRING(#A、5、8) 注意:
|
POSITION-clause
|
POSITION 節:
|
CHARPOSITION
operand4
|
CHARPOSITION 節:
|
CHARLENGTH
operand5
|
CHARLENGTH 節:
|
GIVING POSITION IN
operand6 |
GIVING POSITION 節:
|
GIVING LENGTH IN
operand7 |
GIVING LENGTH 節:
|
注意:
CHARPOSITION と CHARLENGTH 節の一方または両方を指定する必要があります。
GIVING POSITION と GIVING
LENGTH 節の一方または両方を指定する必要があります。
** 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
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
** 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
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-
* 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
*
EXAMINE #STRING FOR #SV(*,*) AND REPLACE WITH #RV(*)
Before: AAABbbbbBCCCcccCaaaA
After: ++A--bb--****c**aa++ Number found: 7
この例では、文字 ä と ü を含む 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 |
| 以下、同様。 | 以下、同様。 |