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 and Code Page Support in
Natural Programming
Language, Abschnitt
Statements,
EXAMINE.
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. |