Dieses Dokument behandelt folgende Themen:
Verwandte Statements: ADD
| COMPRESS
|
COMPUTE
|
DIVIDE
|
MOVE
|
MOVE ALL
|
MULTIPLY
|
RESET
|
SEPARATE
|
SUBTRACT
Gehört zur Funktionsgruppe: Arithmetische Funktionen und Datenzuweisungen
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 |
Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.
Das Statement EXAMINE
dient dazu, den Inhalt eines
alphanumerischen oder binären Feldes oder eines Bereiches von Feldern innerhalb
eines Arrays abzusuchen und um
zu zählen, wie oft eine bestimmte Zeichenkette vorkommt;
die Byte-Position zurückzugeben, an der eine gesuchte Zeichenkette zuerst erscheint;
die signifikante Länge des Inhalts eines Feldes zurückzugeben, d.h. die Feldlänge ohne nachfolgende Leerzeichen;
die Ausprägungsnummer (Indizes) eines Array-Feldes zurückzugeben, wo eine Zeichenkette zuerst gefunden wurde;
eine Zeichenkette gegen eine andere Zeichenkette auszutauschen;
eine Zeichenkette zu löschen.
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | C* | S | A | A | U | B | ja | nein | ||||||||||||
operand2 | C | S | N | P | I | B* | ja | nein | ||||||||||||
operand3 | C | S | N | P | I | B* | ja | nein | ||||||||||||
operand4 | C | S | A | U | B | ja | nein |
* operand1 darf nur eine Konstante
sein, wenn Sie die GIVING
-Klausel verwenden, aber nicht, wenn Sie
die DELETE
-REPLACE
-Klausel verwenden.
* operand4
kann auch ein
Array sei, siehe Suchen
und Ersetzen mit mehreren Werten.
* Format B von operand2 und operand3 kann nur mit einer Länge von kleiner gleich 4 verwendet werden.
Syntax-Element-Beschreibung:
Syntax-Element | Beschreibung |
---|---|
DIRECTION-clause
|
DIRECTION-Klausel:
Mit dieser Klausel legen Sie die Suchrichtung fest. Weitere Informationen siehe DIRECTION-Klausel weiter unten. |
operand1
|
Zu untersuchendes Feld:
Ist |
POSITION-clause
|
POSITION-Klausel:
Mit dieser Klausel können Sie für die Untersuchung eine
Start- und Endeposition innerhalb von
|
operand4
|
Für die EXAMINE-Operation zu benutzender
Wert:
Weitere Informationen zu
|
FULL
|
FULL-Option:
Wenn Sie für einen Operanden |
SUBSTRING
|
SUBSTRING-Option:
Normalerweise wird der ganze Inhalt des Feldes untersucht, und zwar vom Anfang des Feldes bis zum Ende bzw. bis zum letzten Zeichen, das kein Leerzeichen ist. Die Option Um zum Beispiel die 5. bis einschließlich 12. Stelle eines Feldes #A zu untersuchen, geben Sie folgendes an: EXAMINE SUBSTRING(#A,5,8). Anmerkungen:
|
PATTERN
|
PATTERN-Option:
Wenn Sie das Feld nach einem Wert absuchen möchten, der
Variablen enthält, d.h. Platzhalter für Stellen, die bei der Suche nicht
berücksichtigt werden sollen, verwenden Sie die Option
Beispiel: Mit |
DELIMITERS-option
|
DELIMITERS-Option:
Diese Option wird zum Suchen eines Wertes benutzt, der Delimiter aufweist. Einzelheiten siehe DELIMITERS-Option weiter unten. |
DELETE-REPLACE-clause
|
DELETE REPLACE-Klausel:
Die Die Siehe DELETE REPLACE-Klausel weiter unten. |
GIVING-clause
|
GIVING-Klausel:
Siehe GIVING-Klausel weiter unten. |
Diese Klausel bestimmt die Suchrichtung.
FORWARD
|
|||
DIRECTION
|
BACKWARD
|
||
operand8 |
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand8 | C | S | A1 | ja | nein |
Anmerkung:
Wenn die DIRECTION
-Klausel nicht angegeben ist,
wird die Standardsuchrichtung FORWARD
benutzt.
Mit dieser Klausel können Sie für die Untersuchung eine Start-
und Endeposition innerhalb von operand1
(oder dem Substring von operand1
)
angeben.
[[STARTING ]
FROM [POSITION ]
operand9]
|
ENDING AT
|
[POSITION ]
operand10
|
||||
THRU
|
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand9 | C | S | N | P | I | ja | nein | ||||||||||||
operand10 | C | S | N | P | I | ja | nein |
Syntax-Element-Beschreibung:
Startposition (operand9
)
und Endeposition (operand10
) sind
relativ zu operand1
oder dem Substring von operand1
und
werden beide verarbeitet.
Die Suche beginnt an der Startposition und endet an der Endeposition.
Wenn Start- und/oder Endeposition nicht angegeben sind, gelten die Standardwerte für die Position. Der Wert wird duch die Suchrichtung bestimmt:
Surchrichtung | Standardstartposition | Standardendeposition |
---|---|---|
FORWARD |
1 (erstes Zeichen) | Länge von
operand1 (letztes Zeichen)
|
BACKWARD |
Länge von
operand1 (letztes Zeichen)
|
1 (erstes Zeichen) |
Anmerkung:
Eine Suche wird nicht durchgeführt, wenn die
Suchrichtung FORWARD
ist und die Startposition größer als die
Endeposition ist, oder wenn die Suchrichtung BACKWARD
ist und die
Startposition kleiner als die Endeposition ist.
ABSOLUTE
|
||
[WITH
DELIMITERS ]
|
||
[WITH
DELIMITERS ]
operand5
|
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand5 | C | S | A | U | B | ja | nein |
Syntax-Element-Beschreibung:
Syntax-Element | Beschreibung |
---|---|
ABSOLUTE
|
Absolute Suche:
Standardmäßig gilt die Option |
WITH DELIMITERS
|
Suchwert mit beliebigen
Begrenzungszeichen:
Bei Angabe der Option Die Definition des Begrenzungszeichens kann mit dem
Profilparameter |
WITH DELIMITERS
operand5
|
Suchwert mit bestimmten
Begrenzungszeichen:
Mit |
[AND ]
|
DELETE
[FIRST ]
|
||
REPLACE [FIRST ] [WITH ] [FULL [VALUE [OF ]]]
operand6
|
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand6 | C | S | A* | A | U | B | ja | nein |
* operand6
kann auch ein
Array sein, siehe Suchen und Ersetzen mit mehreren
Werten.
Syntax-Element-Beschreibung:
Syntax-Element | Beschreibung |
---|---|
DELETE |
Lösch-Option:
Dient zum Löschen der ersten (oder aller)
Ausprägung(en) des Suchwertes
( |
REPLACE |
Austausch-Option:
Wird benutzt zum Ersetzen der ersten (oder aller)
Ausprägung(en) des Suchwertes
( |
FIRST |
Löschen/Austauschen des ersten
identischen Werts:
Wenn Sie das Schlüsselwort |
Anmerkungen:
REPLACE
-Operation zur Generierung
von mehr Zeichen führt, als in den
operand1
passen, erhalten Sie eine
Fehlermeldung.
operand1
eine
dynamische Variable ist, kann eine REPLACE
-Operation dazu führen,
dass seine Länge vergrößert oder verkleinert wird; eine
DELETE
-Operation kann dazu führen, dass seine Länge auf Null (0)
gesetzt wird. Die aktuelle Länge einer dynamischen Variablen kann mittels der
Systemvariable *LENGTH
ermittelt werden. Allgemeine Informationen zu dynamischen Variablen siehe
Dynamische Variablen
benutzen.
Der Suchwert (operand4
)
und der Ersetzungswert (operand6
)
können auch als Array-Felder definiert werden. Dadurch ist es mit nur einem
EXAMINE
-Statement möglich, mehrere unterschiedliche Muster in dem
geprüften Feld (operand1
) zu ersetzen.
Der Such- und der Ersetzungsoperand brauchen nicht die gleiche Anzahl an
Ausprägungen zu haben. Es muss lediglich die Übertragungskompatibilität
zwischen diesen Feldern gewährleistet sein, d.h.
operand4:=operand6
muss eine gültige Operation sein; siehe auch
Zuweisungen bei
Arrays im Leitfaden zur
Programmierung.
Die Operationslogik für die Suche mit mehreren Werten arbeitet wie folgt:
Das zu prüfenden Feld
(operand6
) wird nur einmal durchlaufen,
entweder von links nach rechts für Richtung FORWARD
oder von
rechts nach links für Richtung BACKWARD
.
Die Werte im Such-Array
(operand4
) werden, beginnend mit der
ersten Position, auf Übereinstimmung geprüft, und zwar einer nach dem anderen,
wobei mit der Array-Ausprägung mit dem niedrigsten Index begonnen wird.
Wird kein Suchwert gefunden, wird der Vergleich bei der nächsten Feldposition fortgesetzt.
Wenn eines der gesuchten Muster in einem geprüften Feld
(operand1
) gefunden wird, dann wird es
durch den Wert des Ersetzungs-Arrays
(operand6
) ersetzt, das das
übereinstimmende Muster in operand4
überschreibt, wenn eine Operation
operand4:=operand6
ausgeführt würde.
Nachdem die Ersetzung eines Musters erfolgt ist, wird der Vergleichsvorgang unmittelbar nach dem eingefügten Wert mit der ersten Ausprägung für das Such-Array fortgesetzt. Das bedeutet, dass ein schon einmal ersetztes Muster übersprungen wird und kein zweites Mal mehr ersetzt werden kann.
Beispiel:
Dieses Beispiel zeigt die Ersetzung des Kleiner-als-Zeichens
(<), des Größer-als-Zeichens (>) und des Zeichens für das Kaufmännische
Und (&) durch die entsprechenden HTML-Zeichen '<'
,
'>'
und '&'
.
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
Siehe auch Beispiel 3 - EXAMINE und REPLACE mit mehreren Werten.
GIVING
[IN ]
operand7 |
||||
[GIVING ]
NUMBER [IN ]
operand7 |
||||
[[GIVING ]
POSITION [IN ] operand7]
|
||||
[[GIVING ]
LENGTH [IN ]
operand7]
|
||||
[[GIVING ]
INDEX [IN ]
operand7 ...3] |
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand7 | S | N | P | I | ja | ja |
Syntax-Element-Beschreibung:
Syntax-Element | Beschreibung |
---|---|
GIVING
|
GIVING-Klausel:
Wenn nur das Schlüsselwort |
NUMBER
|
GIVING NUMBER-Klausel:
Wird benutzt, um die Zahl zu erhalten, wie oft der zu
suchende Wert ( |
POSITION
|
GIVING POSITION-Klausel:
Mit |
LENGTH
|
GIVING LENGTH-Klausel:
Mit |
operand7
|
Anzahl der Ausprägungen:
Die Anzahl der Ausprägungen des Suchwertes. Wenn auch
die Option |
INDEX
operand7 ...3 |
GIVING INDEX-Klausel:
This option is only applicable if the underlying field to be examined is an array field.
Anmerkung: |
EXAMINE
|
operand1 | [AND ]
|
||||||||
SUBSTRING
|
(operand1,operand2,operand3) | |||||||||
TRANSLATE
|
INTO
|
UPPER
|
[CASE ]
|
|||||||
LOWER
|
||||||||||
USING [INVERTED ]
operand4
|
Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.
Das Statement EXAMINE TRANSLATE
dient dazu, die in
einem Feld enthaltenen Zeichen in Groß- oder Kleinschreibung oder in andere
Zeichen umzusetzen.
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | S | A | A | B | ja | nein | |||||||||||||
operand2 | C | S | N | P | I | B* | ja | nein | |||||||||||
operand3 | C | S | N | P | I | B* | ja | nein | |||||||||||
operand4 | S | A | A | B | ja | nein |
*Format B von operand2
und
operand3
kann nur mit einer Länge von
kleiner gleich 4 verwendet werden.
Syntax-Element-Beschreibung:
Syntax-Element | Beschreibung |
---|---|
EXAMINE
operand1
|
Umsetzung des kompletten
Feldinhalts:
|
EXAMINE
SUBSTRING operand1
operand2
operand3
|
Umsetzung von Teilen des
Feldinhalts:
Normalerweise wird der Inhalt des gesamten Feldes umgesetzt. Die Option Um zum Beispiel die 5. bis einschließlich 12. Stelle
eines Feldes EXAMINE SUBSTRING(#A,5,8) AND TRANSLATE ... Anmerkung: |
TRANSLATE INTO
UPPER CASE
|
Umsetzung in
Großbuchstaben:
Der Inhalt von |
TRANSLATE INTO
LOWER CASE
|
Umsetzung in
Kleinbuchstaben:
Der Inhalt von |
TRANSLATE USING
operand4
|
Zu benutzende Umsetzungstabelle:
Anmerkung: |
INVERTED
|
Wenn Sie das Schlüsselwort INVERTED
angeben, wird die Umsetzungstabelle
(operand4 ) in umgekehrter Richtung
verwendet, d.h. die Umsetzungsrichtung wird umgekehrt.
|
EXAMINE
[FULL [VALUE [OF ]]] |
|||
[POSITION-clause ]
|
|||
[FOR ]
|
|
||
[GIVING ]
POSITION IN
operand6 [[GIVING ]
LENGTH IN
operand7 ]
|
Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.
Unter einem Graphem versteht ein Benutzer normalerweise ein Zeichen. In den meisten Fällen ist eine UTF-16 Code-Einheit (= U-Formatzeichen) ein Graphem, allerdings kann ein Graphem auch aus mehreren Code-Einheiten bestehen. Beispiele sind: eine Folge von einem Basiszeichen gefolgt von Kombinationszeichen oder einem Ersatz-Paar. Weitere Informationen zu Graphemen und anderen Unicode-Begriffen entnehmen Sie dem Dokument The Unicode Standard unter http://www.unicode.org/.
Das Statement EXAMINE
für U-Format-Operanden spricht
im Allgemeinen Code-Einheiten an. Allerdings ist es bei
CHARPOSITION
- und CHARLENGTH
-Klauseln möglich, die
Startposition und Länge (als Code-Einheiten) einer Graphem-Sequenz zu erhalten.
Die zurückgegeben Code-Einheitswerte können dann in anderen Statements/Klauseln
benutzt werden, für die Code-Einheitsoperanden erforderlich sind (zum Beispiel
in einer SUBSTRING
-Klausel).
Weitere Informationen zur Syntax des
EXAMINE
-Statements, siehe auch
Unicode- und
Codepage-Unterstützung in der Natural-Programmiersprache,
Abschnitt Natural-Statements,
Unterabschnitt EXAMINE
in der Unicode- und
Codepage-Unterstützung-Dokumentation.
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | C | S | A | U | B | ja | nein | ||||||||||||
operand2 | C | S | N | P | I | B* | ja | nein | |||||||||||
operand3 | C | S | N | P | I | B* | ja | nein | |||||||||||
operand4 | C | S | N | P | I | ja | nein | ||||||||||||
operand5 | C | S | N | P | I | ja | nein | ||||||||||||
operand6 | C | S | N | P | I | ja | nein | ||||||||||||
operand7 | C | S | N | P | I | ja | nein |
* Format B von operand2 und operand3 kann nur mit einer Länge von kleiner gleich 4 benutzt werden.
Syntax-Element-Beschreibung:
Syntax-Element | Beschreibung |
---|---|
FULL
|
FULL-Option:
Wenn |
SUBSTRING
operand1
operand2
operand3 |
SUBSTRING-Option:
Normalerweise wird der ganze Inhalt des Feldes untersucht, und zwar vom Anfang des Feldes bis zum Ende bzw. bis zum letzten signifikanten Zeichen. Die Option Um zum Beispiel die 5. bis einschließlich 12. Stelle
eines Feldes EXAMINE SUBSTRING (#A,5,8) Anmerkungen:
|
POSITION-clause
|
POSITION-Klausel:
Bereichswerte für |
CHARPOSITION operand4
|
CHARPOSITION-Klausel:
operand4 legt die
Startposition (als Unicode-Grapheme) der Graphem-Sequenz fest. Die
entsprechende Position wird in |
CHARLENGTH
operand5
|
CHARLENGTH-Klausel:
|
GIVING POSITION IN
operand6 |
GIVING POSITION-Klausel:
|
GIVING LENGTH IN
operand7 |
GIVING LENGTH-Klausel:
|
Anmerkungen:
CHARPOSITION
- oder die
CHARLENGTH
-Klausel oder beide angegeben werden.
GIVING POSITION
- oder die
GIVING LENGTH
-Klausel oder beide angegeben werden.
** 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
Ausgabe des Programms 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
** 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
Ausgabe des Programms 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-
* 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 *
Ausgabe des Programms EXMEX3
:
EXAMINE #STRING FOR #SV(*,*) AND REPLACE WITH #RV(*) Before: AAABbbbbBCCCcccCaaaA After: ++A--bb--****c**aa++ Number found: 7
Dieses Beispiel veranschaulicht die Analyse einer
Unicode-Zeichenkette mit den Zeichen ä
und ü
. Beide
Zeichen sind als Basiszeichen, gefolgt von einem Kombinationszeichen
festgelegt: ä
ist als U+0061
, gefolgt von
U+0308
kodiert, und ü
ist als U+0075
,
gefolgt von U+0308
kodiert.
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
Ausgabe:
Großrechner-Umgebungen: | Windows-, UNIX- und OpenVMS-Umgebungen (mit Natural Web I/O Interface): |
---|---|
UNICODE-STRING: ABa?CDu?EF CHARACTER NO.: 1 STARTS AT BYTE POSITION: 1 AND THE LENGTH IS: 1 |
UNICODE-STRING: ABäCDüEF CHARACTER NO.: 1 STARTS AT BYTE POSITION: 1 AND THE LENGTH IS: 1 |
Drücken Sie die Eingabetaste um fortzufahren. | Drücken Sie die Eingabetaste um fortzufahren. |
UNICODE-STRING: ABa?CDu?EF CHARACTER NO.: 2 STARTS AT BYTE POSITION: 2 AND THE LENGTH IS: 1 |
UNICODE-STRING: ABäCDüEF CHARACTER NO.: 2 STARTS AT BYTE POSITION: 2 AND THE LENGTH IS: 1 |
Drücken Sie die Eingabetaste um fortzufahren. | Drücken Sie die Eingabetaste um fortzufahren. |
Beachten Sie, dass das Zeichen in Position 3 eine Kombinationszeichenfolge ist und zwei Code-Einheiten lang ist. | |
UNICODE-STRING: AB<b>a</b>?CDu?EF CHARACTER NO.: 3 STARTS AT BYTE POSITION: 3 AND THE LENGTH IS: 2 |
UNICODE-STRING: AB<b>ä</b>CDüEF CHARACTER NO.: 3 STARTS AT BYTE POSITION: 3 AND THE LENGTH IS: 2 |
Und so weiter. | Und so weiter. |