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]} |
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) nach einer bestimmten Zeichenkette 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 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 | 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.
* Format B von operand2 und operand3 kann nur mit einer Länge von kleiner gleich 4 verwendet werden.
Syntax-Element-Beschreibung:
DIRECTION-clause |
Suchrichtung:
Mit dieser Klausel legen Sie die Suchrichtung fest. Weitere Informationen siehe DIRECTION-Klausel weiter unten. |
---|---|
operand1 |
Zu untersuchendes Feld:
operand1 ist das Feld, dessen Inhalt untersucht werden soll. Ist operand1 eine dynamische Variable,
kann deren Länge über eine Sie finden allgemeine Informationen über dynamische Variablen im Abschnitt Große und dynamische Variablen/Felder. |
POSITION-clause |
POSITION-Klausel:
Mit dieser Klausel können Sie für die Untersuchung eine Start- und Endeposition innerhalb von operand1 angeben (oder den Substring von operand1). Weitere Informationen siehe POSITION-Klausel weiter unten. |
operand4 |
Suchwert:
operand4 ist der für die Untersuchung zu verwendende Wert. Weitere Informationen zu operand4 und operand6 siehe operand6, der in der unten beschriebenen DELETE REPLACE-Klausel benutzt wird. |
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 signifikanten Zeichen. 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 darstellt. 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 Standardrichtung FORWARD
benutzt.
Mit dieser Klausel können Sie für die Untersuchung eine Start- und Endeposition innerhalb von operand1 angeben (oder den Substring von operand1).
[[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:
FROM operand9 | operand9 definiert die Startposition für die Untersuchung. |
---|---|
ENDING AT / THROUGH operand10 | operand10 definiert die Endeposition für die Untersuchung. |
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:
Richtung | Standardstartposition | Standardendeposition |
---|---|---|
FORWARD |
1 (erstes Zeichen) | Länge von operand1 (letztes Zeichen) |
BACKWARD |
Länge von operand1 (letztes Zeichen) | 1 (erstes Zeichen) |
Mit dieser Lösung ist EXAMINE BACKWARD ...
identisch mit
EXAMINE BACKWARD ... FROM *LENGTH(...) THRU 1
und funktioniert wie
erwartet.
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 | B | ja | nein |
Syntax-Element-Beschreibung:
[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 |
Syntax-Element-Beschreibung:
DELETE |
Lösch-Option:
Dient zum Löschen der ersten (oder aller) Ausprägung(en) des Suchwertes (operand4) im Inhalt von operand1. |
---|---|
REPLACE |
Austausch-Option:
Wird benutzt zum Austauschen der ersten (oder aller) Ausprägung(en) des Suchwertes (operand4) in operand1 durch den in operand6 angegebenen Austauschwert. |
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 operand1 passen, erhalten Sie
eine Fehlermeldung.
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 auf 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
belegt, 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 1:
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
Beispiel 2:
Dieses Beispiel zeigt die Ersetzung des Musters 'AA'
,
'Aa'
und 'aA'
durch '++'
, des Musters
'BB'
, 'Bb'
und 'bB'
durch
'--'
und des Musters 'CC'
, 'Cc'
und
'cC'
durch '**'
.
DEFINE DATA LOCAL 1 #SV (A2/1:3,1:3) INIT (1,V) <'AA','BB','CC'> (3,V) <'Aa','Bb','Cc'> (2,V) <'aA','bB','cC'> 1 #RV (A2/1:3) INIT <'++','--','**'> 1 #STRING (A20) INIT <'AAABbbbbBCCCcccCaaaA'> END-DEFINE DISPLAY #STRING /* shows 'AAABbbbbBCCCcccCaaaA' EXAMINE #STRING FOR #SV(*,*) AND REPLACE WITH #RV(*) DISPLAY #STRING /* shows '++A--bb--****c**aa++' END
GIVING
|
|||||||||
NUMBER
|
|||||||||
[GIVING ]
|
POSITION
|
[IN ]
|
operand7 | ||||||
LENGTH
|
|||||||||
[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:
GIVING | Wenn nur das Schlüsselwort GIVING
angegeben wird, entspricht dies GIVING NUMBER (Voreinstellung).
|
---|---|
NUMBER | Wird benutzt, um die Zahl zu erhalten, wie oft der zu suchende Wert (operand4) in dem Feld (operand1) gefunden wird, dessen Inhalt überprüft werden soll. |
POSITION | Mit GIVING POSITION erhalten Sie die
Byte-Position, die der erste gefundene Wert
(operand4) innerhalb von
operand1 (bzw. des Substrings von
operand1) innehat.
|
LENGTH | Mit GIVING LENGTH erhalten Sie die
Länge von operand1
(bzw. des Substrings von operand1), nachdem alle
DELETE - bzw. REPLACE -Operationen abgeschlossen sind.
Nachfolgende Leerzeichen werden ignoriert.
|
operand7 | Die Anzahl der Ausprägungen des Suchwertes. Wenn
auch die Option REPLACE
FIRST oder DELETE
FIRST benutzt wird, ist die Zahl nicht größer als 1.
|
INDEX operand7...3 | Siehe GIVING INDEX-Option weiter unten. |
[GIVING ]
INDEX [IN ]
operand7
3
|
Diese Option steht nur zur Verfügung, wenn das zu überprüfende zugrundeliegende Feld ein Array-Feld ist.
Syntax-Element-Beschreibung:
INDEX | Mit GIVING INDEX erhalten Sie die
Nummer der Ausprägung (Index) von operand1, in
der der erste gefundene Wert (operand4)
enthalten ist.
|
---|---|
operand7...3 | operand7 muss genauso oft angegeben werden wie operand1 Dimensionen hat (höchstens dreimal). operand7 enthält Null, wenn der gesuchte Wert in keiner der Ausprägungen enthalten ist. |
Anmerkung:
Falls der Indexbereich von operand1 die
Ausprägung Null enthält (z.B. 0:5
), ist der Wert 0
in
operand7 zweideutig. In diesem Falle sollte eine
zusätzliche GIVING
NUMBER
-Klausel verwendet werden, um festzustellen, ob der
gesuchte Wert tatsächlich vorkommt oder nicht.
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:
EXAMINE operand1 |
Umsetzung des kompletten
Feldinhalts:
operand1 ist das Feld, dessen Inhalt umgesetzt werden soll. |
---|---|
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 operand1 wird in Großbuchstaben umgesetzt. |
TRANSLATE INTO LOWER CASE |
Umsetzung in Kleinbuchstaben:
Der Inhalt von operand1 wird in Kleinbuchstaben umgesetzt. |
TRANSLATE USING operand4 |
Zu benutzende Umsetzungstabelle:
operand4 ist die Umsetzungstabelle, die für die Zeichenumsetzung verwendet werden soll. Die Tabelle muss Format/Länge A2 oder B2 haben. Anmerkung: |
INVERTED | Wenn Sie das Schlüsselwort INVERTED angeben, wird
die Umsetzungstabelle (operand4) in umgekehrter
Richtung verwendet, d.h. die Umsetzungsrichtung wird umgekehrt.
|
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 | A | N | P | I | ja | nein | |||||||||||
operand5 | C | S | A | 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:
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
operand6 in Form von Code-Einheiten zurückgegeben.
Diese Klausel kann weggelassen werden, wenn die |
CHARLENGTH operand5 |
CHARLENGTH-Klausel:
operand5 legt die Länge der
Graphem-Sequenz (als Unicode-Grapheme) fest. Die Länge der Graphem-Sequenz wird
in Form von Code-Einheiten in operand7
zurückgegeben. Diese Klausel kann weggelassen werden, wenn die
|
GIVING POSITION IN operand6 |
GIVING POSITION-Klausel:
operand6 enthält (als Code-Einheiten)
die Startposition der von operand4 und
operand5 definierten Graphem-Sequenz. Wenn
operand1 weniger als
operand4 Grapheme hat, wird Null (0) zurückgegeben.
Diese Klausel kann weggelassen werden, wenn die |
GIVING LENGTH IN operand7 |
GIVING LENGTH-Klausel:
operand7 enthält (als Code-Einheiten)
die Länge der mit operand4 und
operand5 definierten Graphem-Sequenz. Wenn
operand1 weniger als
operand4+operand5
Grapheme hat, wird 0 zurückgegeben. Diese Klausel kann weggelassen werden, wenn
die |
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 (A40) 1 #A (A1) 1 #START (N2) 1 #NMB1 (N2) 1 #NMB2 (N2) 1 #NMB3 (N2) 1 #NMBEX2 (N2) 1 #NMBEX3 (N2) 1 #NMBEX4 (N2) 1 #POSEX5 (N2) 1 #LGHEX6 (N2) 1 #NMBEX7 (N2) 1 #NMBEX8 (N2) END-DEFINE * WRITE 'EXAMPLE 1 (GIVING NUMBER, WITH DELIMITER)' MOVE 'ABC A B C .A. .B. .C. -A- -B- -C- ' TO #TEXT ASSIGN #A = 'A' EXAMINE #TEXT FOR #A GIVING NUMBER #NMB1 EXAMINE #TEXT FOR #A WITH DELIMITER GIVING NUMBER #NMB2 EXAMINE #TEXT FOR #A WITH DELIMITER '.' GIVING NUMBER #NMB3 WRITE NOTITLE '=' #NMB1 '=' #NMB2 '=' #NMB3 * WRITE / 'EXAMPLE 2 (WITH DELIMITER, REPLACE, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE #TEXT FOR #A WITH DELIMITER '-' REPLACE WITH '*' GIVING NUMBER #NMBEX2 WRITE '=' #TEXT '=' #NMBEX2 * WRITE / 'EXAMPLE 3 (REPLACE, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE #TEXT ' ' REPLACE WITH '+' GIVING NUMBER #NMBEX3 WRITE '=' #TEXT '=' #NMBEX3 * WRITE / 'EXAMPLE 4 (FULL, REPLACE, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE FULL #TEXT ' ' REPLACE WITH '+' GIVING NUMBER #NMBEX4 WRITE '=' #TEXT '=' #NMBEX4 * WRITE / 'EXAMPLE 5 (DELETE, GIVING POSITION)' WRITE '=' #TEXT EXAMINE #TEXT '+' DELETE GIVING POSITION #POSEX5 WRITE '=' #TEXT '=' #POSEX5 * WRITE / 'EXAMPLE 6 (DELETE, GIVING LENGTH)' WRITE '=' #TEXT EXAMINE #TEXT FOR 'A' DELETE GIVING LENGTH #LGHEX6 WRITE '=' #TEXT '=' #LGHEX6 * * NEWPAGE * MOVE 'ABC A B C .A. .B. .C. -A- -B- -C- ' TO #TEXT * ASSIGN #A = 'A B C' ASSIGN #START = 6 * WRITE / 'EXAMPLE 7 (SUBSTRING, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE SUBSTRING(#TEXT,#START,9) FOR #A GIVING NUMBER #NMBEX7 WRITE '=' #TEXT '=' #NMBEX7 * WRITE / 'EXAMPLE 8 (PATTERN, GIVING NUMBER)' WRITE '=' #TEXT EXAMINE #TEXT FOR PATTERN '-A-' GIVING NUMBER #NMBEX8 WRITE '=' #TEXT '=' #NMBEX8 * END
Ausgabe des Programms EXMEX1
:
EXAMPLE 1 (GIVING NUMBER, WITH DELIMITER) #NMB1: 4 #NMB2: 3 #NMB3: 1 EXAMPLE 2 (WITH DELIMITER, REPLACE, GIVING NUMBER) #TEXT: ABC A B C .A. .B. .C. -A- -B- #TEXT: ABC A B C .A. .B. .C. -*- -B- #NMBEX2: 1 EXAMPLE 3 (REPLACE, GIVING NUMBER) #TEXT: ABC A B C .A. .B. .C. -*- -B- #TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B- #NMBEX3: 18 EXAMPLE 4 (FULL, REPLACE, GIVING NUMBER) #TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B- #TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-+ #NMBEX4: 1 EXAMPLE 5 (DELETE, GIVING POSITION) #TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-+ #TEXT: ABCABC.A..B..C.-*--B- #POSEX5: 4 EXAMPLE 6 (DELETE, GIVING LENGTH) #TEXT: ABCABC.A..B..C.-*--B- #TEXT: BCBC...B..C.-*--B- #LGHEX6: 18
EXAMPLE 7 (SUBSTRING, GIVING NUMBER) #TEXT: ABC A B C .A. .B. .C. -A- -B- #TEXT: ABC A B C .A. .B. .C. -A- -B- #NMBEX7: 1 EXAMPLE 8 (PATTERN, GIVING NUMBER) #TEXT: ABC A B C .A. .B. .C. -A- -B- #TEXT: ABC A B C .A. .B. .C. -A- -B- #NMBEX8: 1
** Example 'EXMEX2': EXAMINE TRANSLATE ************************************************************************ DEFINE DATA LOCAL 1 #TEXT (A50) 1 #TAB (A2/1:10) 1 #START (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 'EXAMPLE 1 (USING TRANSLATION TABLE)' WRITE '=' #TEXT EXAMINE #TEXT TRANSLATE USING #TAB(*) WRITE NOTITLE '=' #TEXT * WRITE / 'EXAMPLE 2 (USING INVERTED TRANSLATION TABLE)' WRITE '=' #TEXT EXAMINE #TEXT TRANSLATE USING INVERTED #TAB(*) WRITE NOTITLE '=' #TEXT * WRITE / 'EXAMPLE 3 (USING SUBSTRING, LOWER CASE)' WRITE '=' #TEXT ASSIGN #START = 13 EXAMINE SUBSTRING(#TEXT,#START,15) TRANSLATE INTO LOWER CASE WRITE '=' #TEXT END
Ausgabe des Programms EXMEX2
:
EXAMPLE 1 (USING TRANSLATION TABLE) #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- #TEXT: XYZ X Y Z .X. .Y. .Z. -X- -Y- -Z- EXAMPLE 2 (USING INVERTED TRANSLATION TABLE) #TEXT: XYZ X Y Z .X. .Y. .Z. -X- -Y- -Z- #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- EXAMPLE 3 (USING SUBSTRING, LOWER CASE) #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- #TEXT: ABC A B C .a. .b. .c. -A- -B- -C-
** Example 'EXMEX2': EXAMINE TRANSLATE ************************************************************************ DEFINE DATA LOCAL 1 #TEXT (A50) 1 #TAB (A2/1:10) 1 #START (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 'EXAMPLE 1 (USING TRANSLATION TABLE)' WRITE '=' #TEXT EXAMINE #TEXT TRANSLATE USING #TAB(*) WRITE NOTITLE '=' #TEXT * WRITE / 'EXAMPLE 2 (USING INVERTED TRANSLATION TABLE)' WRITE '=' #TEXT EXAMINE #TEXT TRANSLATE USING INVERTED #TAB(*) WRITE NOTITLE '=' #TEXT * WRITE / 'EXAMPLE 3 (USING SUBSTRING, LOWER CASE)' WRITE '=' #TEXT ASSIGN #START = 13 EXAMINE SUBSTRING(#TEXT,#START,15) TRANSLATE INTO LOWER CASE WRITE '=' #TEXT END
Ausgabe des Programms EXMEX2
:
EXAMPLE 1 (USING TRANSLATION TABLE) #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- #TEXT: XYZ X Y Z .X. .Y. .Z. -X- -Y- -Z- EXAMPLE 2 (USING INVERTED TRANSLATION TABLE) #TEXT: XYZ X Y Z .X. .Y. .Z. -X- -Y- -Z- #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- EXAMPLE 3 (USING SUBSTRING, LOWER CASE) #TEXT: ABC A B C .A. .B. .C. -A- -B- -C- #TEXT: ABC A B C .a. .b. .c. -A- -B- -C-
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. |