progress-4gl
Zeichenketten
Suche…
Einführung
In Progress ABL gibt es zwei Arten von Zeichenfolgen, die als CHARACTER
und die als LONGCHAR
definiert LONGCHAR
. Eine Datei mit einer Länge von mehr als LONGCHAR
ist ein LONGCHAR
. Die meisten Zeichenfolgen sind, sofern nicht anders angegeben, unabhängig von der Groß- und Kleinschreibung.
Bemerkungen
Denken Sie daran - alle Positionen beginnen mit der Position 1!
Eine Zeichenfolge definieren, bewerten und anzeigen
Generell sollten Sie immer alle Variablen und Parameter als NO-UNDO
sofern Sie NO-UNDO
nicht wirklich NO-UNDO
.
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "HELLO".
DISPLAY cString.
Zeichenketten verketten
Mit dem Operator +
können Sie zwei oder mehr Strings problemlos verketten.
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "HELLO".
cString = cString + " " + "GOODBYE".
DISPLAY cString FORMAT "X(20)".
String-Manipulation
Es gibt einige nützliche Funktionen für die Arbeit mit String. Alle Funktionen, die mit der Position von Zeichen arbeiten, beginnen mit Index 1 als erstem Zeichen und nicht mit 0, wie in vielen Sprachen üblich.
STRING - wandelt einen beliebigen Wert in einen String um
In diesem Beispiel wird die Ganzzahl 2000 in die Zeichenfolge "2000" konvertiert.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
i = 2000.
c = STRING(i).
DISPLAY c.
CHR und ASC - konvertiert einzelne Zeichen von und nach ASCII.
CHR (ganze Zahl)
Gibt die Zeichendarstellung für den ASCII-Code Integer zurück
ASC (Zeichen)
Gibt den ganzzahligen ASCII-Wert für das Zeichen zurück
DEFINE VARIABLE ix AS INTEGER NO-UNDO.
DEFINE VARIABLE letter AS CHARACTER NO-UNDO FORMAT "X(1)" EXTENT 26.
DO ix = 1 TO 26:
letter[ix] = CHR((ASC("A")) - 1 + ix).
END.
DISPLAY SKIP(1) letter WITH 2 COLUMNS NO-LABELS
TITLE "T H E A L P H A B E T".
LENGTH - gibt die Länge eines Strings zurück
LÄNGE (String). // Gibt eine Ganzzahl mit der Länge der Zeichenfolge zurück.
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "HELLO".
MESSAGE "The string " cString " is " LENGTH(cString) " characters long" VIEW-AS ALERT-BOX.
SUBSTRING - gibt einen Teil einer Zeichenfolge zurück oder weist einen Teil zu
- SUBSTRING (String, Startposition, Länge).
Gibt "length" Zeichen aus "string" zurück, beginnend an Position "Startposition".
- SUBSTRING (String, Startposition).
Gibt den Rest von "string" zurück, beginnend an Position "Startposition"
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "ABCDEFGH".
DISPLAY SUBSTRING(cString, 4, 2). //Displays "DE"
DISPLAY SUBSTRING(cString, 4). //Displays "DEFGH"
Teilzeichenfolge kann auch verwendet werden, um einen Teil einer Zeichenfolge zu überschreiben. Verwenden Sie dieselbe Syntax, weisen Sie stattdessen diesen Teilstring zu:
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "ABCDEFGH".
SUBSTRING(cString, 4, 2) = "XY". //Replaces position 4 and 5 with "XY"
DISPLAY cString.
Es gibt auch eine ähnliche Funktion namens OVERLAY
Dieses Beispiel aus der Fortschrittsdokumentation behandelt die Unterschiede zwischen OVERLAY
und SUBSTRING
:
/* This procedure illustrates the differences between the SUBSTRING and
OVERLAY statements. */
DEFINE VARIABLE cOriginal AS CHARACTER NO-UNDO INITIAL "OpenEdge".
DEFINE VARIABLE cSubstring AS CHARACTER NO-UNDO.
DEFINE VARIABLE cOverlay AS CHARACTER NO-UNDO.
DEFINE VARIABLE cResults AS CHARACTER NO-UNDO.
/* Default behavior without optional LENGTH. */
ASSIGN
cSubstring = cOriginal
SUBSTRING(cSubstring,2) = "***"
cOverlay = cOriginal
OVERLAY(cOverlay,2) = "***"
cResults = "target = ~"OpenEdge~". ~n~n"
+ "If you do not supply a length, SUBSTRING and OVERLAY default as follows:
~n~n" + "SUBSTRING(target,2) = ~"***~" yields: " + cSubstring + ". ~n"
+ "OVERLAY(target,2) = ~"***~" yields: " + cOverlay + ".".
/* Behavior with zero LENGTH. */
ASSIGN
cSubstring = cOriginal
SUBSTRING(cSubstring,2,0) = "***"
cOverlay = cOriginal
OVERLAY(cOverlay,2,0) = "***"
cResults = cResults + "~n~n"
+ "For a zero length, SUBSTRING and OVERLAY behave as follows: ~n~n"
+ "SUBSTRING(target,2,0) = ~"***~" yields: " + cSubstring + ". ~n"
+ "OVERLAY(target,2,0) = ~"***~" yields: " + cOverlay + ".".
/* Behavior with LENGTH < replacement. */
ASSIGN
cSubstring = cOriginal
SUBSTRING(cSubstring,2,1) = "***"
cOverlay = cOriginal
OVERLAY(cOverlay,2,1) = "***"
cResults = cResults + "~n~n"
+ "For a length shorter than the replacement, SUBSTRING and OVERLAY behave
as follows: ~n~n" + "SUBSTRING(target,2,1) = ~"***~" yields: "
+ cSubstring + ". ~n" + "OVERLAY(target,2,1) = ~"***~" yields: "
+ cOverlay + ".".
/* Behavior with LENGTH = replacement. */
ASSIGN
cSubstring = cOriginal
SUBSTRING(cSubstring,2,3) = "***"
cOverlay = cOriginal
OVERLAY(cOverlay,2,3) = "***"
cResults = cResults + "~n~n"
+ "For a length equal to the replacement, SUBSTRING and OVERLAY behave as
follows: ~n~n" + "SUBSTRING(target,2,3) = ~"***~" yields: "
+ cSubstring + ". ~n" + "OVERLAY(target,2,3) = ~"***~" yields: "
+ cOverlay + ".".
/* Behavior with LENGTH > replacement. */
ASSIGN
cSubstring = cOriginal
SUBSTRING(cSubstring,2,6) = "***"
cOverlay = cOriginal
OVERLAY(cOverlay,2,6) = "***"
cResults = cResults + "~n~n"
+ "For a length greater than the replacement, SUBSTRING and OVERLAY behave
as follows: ~n~n" + "SUBSTRING(target,2,6) = ~"***~" yields: "
+ cSubstring + ". ~n" + "OVERLAY(target,2,6) = ~"***~" yields: "
+ cOverlay + ".".
MESSAGE cResults VIEW-AS ALERT-BOX.
INDEX - gibt die Position eines Strings in einem String zurück.
R-INDEX
sucht dasselbe, sucht aber von rechts nach links.
INDEX (Quelle, Ziel)
Suchziel innerhalb der Quelle (von links nach rechts) und seine Position zurückgeben. Wenn es fehlt, geben Sie 0 zurück.
INDEX (Quelle, Ziel, Startposition).
Wie oben, aber Suche an der Startposition beginnen
DEFINE VARIABLE str AS CHARACTER NO-UNDO.
str = "ABCDEFGH".
DISPLAY INDEX(str, "cd") INDEX(str, "cd", 4). //Will display 3 and 0
REPLACE - ersetzt einen String innerhalb eines Strings.
REPLACE (Zeichenfolge, Von-Zeichenfolge bis Zeichenfolge)
Ersetzt from-string durch to-string in string. From-string und to-string müssen nicht die gleiche Länge haben, to-string kann auch nichts ("") sein, um ein Zeichen zu entfernen.
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
c = "ELLO".
DISPLAY REPLACE(c, "E", "HE"). // Displays "HELLO"
c = "ABABABA".
DISPLAY REPLACE(c, "B", ""). // Remove all Bs
TRIM - Entfernt führende und nachgestellte Leerzeichen (oder andere Zeichen).
Dies kann beim Aufräumen von Daten hilfreich sein.
TRIM (String)
Entfernt alle führenden und nachgestellten Leerzeichen, Tabulatoren, Zeilenvorschub und Wagenrücklauf.
TRIM (Zeichenfolge, Zeichen).
Entfernt alle führenden und nachgestellten "Zeichen".
LEFT-TRIM
und RIGHT-TRIM
dasselbe, führen aber nur nach vorne oder nach hinten.
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
c = "__HELLO_WORLD_____".
DISPLAY TRIM(c, "_").
/*Displays HELLO_WORLD without all the leading and
trailing underscores but leaves the one in the middle.
REPLACE would have removed that one as well */
SUBSTITUTE - Ersetzt Parameter in einer Zeichenfolge.
SUBSTITUTE is a limited function for replacing up to nine preformatted parameters in a string.
SUBSTITUTE (Zeichenfolge, Parameter1, Parameter2, ..., Parameter9).
Die Parameter müssen im Format &1
bis &9
.
Wenn Sie ein kaufmännisches Und in der Zeichenfolge verwenden möchten (und nicht als Parameter verwenden), müssen Sie es mit einem anderen kaufmännischen Und-Zeichen ersetzen: &&
.
DEFINE VARIABLE str AS CHARACTER NO-UNDO.
str = "&1 made &2 goals in &3 games playing for &4".
MESSAGE SUBSTITUTE(str, "Zlatan Ibrahimovic", 113, 122, "Paris Saint-Germain") VIEW-AS ALERT-BOX.
MESSAGE SUBSTITUTE(str, "Mats Sundin", 555, 1305, "Toronto Maple Leafs") VIEW-AS ALERT-BOX.
Ein Parameter kann in einer Zeichenfolge mehr als einmal vorkommen. Alle werden ersetzt:
MESSAGE SUBSTITUTE("&1 &2 or not &1 &2", "To", "Be") VIEW-AS ALERT-BOX.
CASE-SENSITIVE Zeichenfolgen
Bei allen Zeichenfolgen in Progress ABL wird zwischen Groß- und Kleinschreibung unterschieden, sofern nicht anders angegeben.
In diesem Beispiel wird ein Meldungsfeld mit der Meldung angezeigt, dass die Zeichenfolgen identisch sind.
DEFINE VARIABLE str1 AS CHARACTER NO-UNDO.
DEFINE VARIABLE str2 AS CHARACTER NO-UNDO.
str1 = "abc".
str2 = "ABC".
IF str1 = str2 THEN
MESSAGE "The strings are identical" VIEW-AS ALERT-BOX.
Um eine Groß- und Kleinschreibung zu definieren, fügen Sie einfach das Attribut CASE-SENSITIVE
DEFINE VARIABLE str1 AS CHARACTER NO-UNDO CASE-SENSITIVE.
DEFINE VARIABLE str2 AS CHARACTER NO-UNDO.
str1 = "abc".
str2 = "ABC".
IF str1 = str2 THEN
MESSAGE "The strings are identical" VIEW-AS ALERT-BOX.
ELSE
MESSAGE "There's a difference" VIEW-AS ALERT-BOX.
(Es reicht, dass eine der Saiten es in diesem Fall hat).
BEGINNT und Streichhölzer
BEGINS - Gibt TRUE zurück, wenn eine Zeichenfolge mit einer anderen Zeichenfolge beginnt .
Zeichenfolge1 BEGINNT Zeichenfolge2
Wenn string1 mit (oder gleich) string2 BEGINNT, wird true zurückgegeben. Sonst wird es false zurück. Wenn Zeichenfolge zwei leer ist (""), wird immer "true" zurückgegeben.
BEGINS ist sehr nützlich bei Abfragen, bei denen Sie den Anfang von etwas suchen möchten, beispielsweise einen Namen. Aber es ist im Grunde eine Funktion auf Strings arbeiten.
DEFINE VARIABLE str AS CHARACTER NO-UNDO.
DEFINE VARIABLE beg AS CHARACTER NO-UNDO.
str = "HELLO".
beg = "HELLO".
DISPLAY str BEGINS beg. // yes
str = "HELLO".
beg = "H".
DISPLAY str BEGINS beg. // yes
str = "HELLO".
beg = "".
DISPLAY str BEGINS beg. // yes
str = "HELLO".
beg = "HELLO WORLD".
DISPLAY str BEGINS beg. // no
MATCHES gibt true zurück, wenn bestimmte Platzhalterkriterien in einer Zeichenfolge erfüllt sind.
Zeichenfolge1 SPIELE Ausdruck
Gibt true zurück, wenn string1 das Wildcard-Ausdruck entspricht:
* (Sternchen) = 0 bis n Zeichen (grundsätzlich jede Zeichenfolge beliebiger Länge)
. (Periode) = Platzhalter für ein beliebiges Zeichen (außer null)
DEFINE VARIABLE str AS CHARACTER NO-UNDO.
DEFINE VARIABLE beg AS CHARACTER NO-UNDO.
str = "HELLO".
beg = "HELLO".
DISPLAY str MATCHES beg. // yes
str = "HELLO".
beg = "H*".
DISPLAY str MATCHES beg. // yes
str = "HELLO".
beg = "*O".
DISPLAY str MATCHES beg. // yes
str = "HELLO WORLD".
beg = "HELLO.WORLD".
DISPLAY str MATCHES beg. // yes
str = "HELLO WORLD".
beg = "*WORL..".
DISPLAY str MATCHES beg. // no
str = "*HELLO WORLD".
beg = "WOR*LD".
DISPLAY str MATCHES beg. // no
Konvertierung von Groß- und Kleinschreibung
Wie zuvor erwähnt, sind Zeichenfolgen normalerweise nicht auf Groß- und Kleinschreibung anwendbar, dies betrifft jedoch nur den Vergleich von Zeichenketten. Es gibt eingebaute Funktionen zum Ändern der Groß- und Kleinschreibung.
CAPS (String)
Macht die Großschreibung der Zeichenkette
LC (String)
Macht String in Kleinbuchstaben
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
DEFINE VARIABLE d AS CHARACTER NO-UNDO.
c = "Hello".
d = "World".
DISPLAY CAPS(c) LC(d). // HELLO world
Denken Sie daran, dass Strings normalerweise nicht zwischen Groß- und Kleinschreibung unterscheiden
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
DEFINE VARIABLE d AS CHARACTER NO-UNDO.
c = "hello".
d = "hello".
DISPLAY CAPS(c) = LC(d). // yes
Sofern nicht spezifisch als CASE-SENSITIVE
DEFINE VARIABLE c AS CHARACTER NO-UNDO CASE-SENSITIVE.
DEFINE VARIABLE d AS CHARACTER NO-UNDO.
c = "hello".
d = "hello".
DISPLAY CAPS(c) = LC(d). // no
Listen
Es gibt eine Reihe von Funktionen und Methoden zum Arbeiten mit durch Kommas (oder andere Zeichen) getrennten Listen in Progress 4GL.
NUM-ENTRIES Gibt die Anzahl der Einträge in einer Liste zurück. Sie können optional Trennzeichen angeben, Komma ist Standard
NUM-ENTRIES (String [, Trennzeichen])
Verwenden Sie das Komma als Standardbegrenzung:
DEFINE VARIABLE cList AS CHARACTER NO-UNDO.
cList = "Goodbye,cruel,world!".
DISPLAY NUM-ENTRIES(cList). //3
Mit einem anderen Trennzeichen, Semilcolon:
DEFINE VARIABLE cList AS CHARACTER NO-UNDO.
cList = "Goodbye;cruel;world!".
DISPLAY NUM-ENTRIES(cList, ";"). //3
ENTRY - Funktion - gibt einen angegebenen Eintrag in einer Liste zurück
Die Startposition ist wie üblich 1, nicht 0!
ENTRY (Eintrag, Liste [, Trennzeichen]).
DEFINE VARIABLE cList AS CHARACTER NO-UNDO.
cList = "Goodbye,cruel,world!".
DISPLAY ENTRY(2, cList). //cruel
ENTRY - Methode - Zuweisen des Wertes eines angegebenen Eintrags in einer Liste
ENTRY (Eintrag, Liste [, Trennzeichen]) = Wert
DEFINE VARIABLE cList AS CHARACTER NO-UNDO.
cList = "Goodbye,cruel,world!".
ENTRY(1, cList) = "Hello".
ENTRY(2, cList) = "nice".
MESSAGE REPLACE(cList, ",", " ") VIEW-AS ALERT-BOX. //Hello nice world!
LOOKUP - Liste für einen bestimmten Eintrag überprüfen. Gibt den Eintrag zurück.
Wenn die Zeichenfolge nicht in der Listensuche enthalten ist, wird 0 zurückgegeben
LOOKUP (Zeichenfolge, Liste [, Trennzeichen])
DEFINE VARIABLE cList AS CHARACTER NO-UNDO.
cList = "Hello,nice,world!".
MESSAGE LOOKUP("nice", cList) VIEW-AS ALERT-BOX. //2
MESSAGE LOOKUP("cruel", cList) VIEW-AS ALERT-BOX. //0
Sonderzeichen (und Escaping)
In Progress 4GL besteht der normale Weg, ein Sonderzeichen zu schreiben, darin, ein Tilde-Zeichen (~) voranzustellen.
Dies sind die Standard-Sonderzeichen
Sequenz | Interpretiert als | Kommentar |
---|---|---|
~ " | " | Wird verwendet, um "in mit" string "definierte Zeichenfolgen zu schreiben. |
~ ' | ' | Wird verwendet, um 'in Strings zu schreiben, die mit' string 'definiert wurden. |
~~ | ~ | Zum Beispiel, wenn Sie die Sequenz drucken möchten und nicht, wie sie interpretiert wird. |
~ \ | \ | |
~ { | { | {wird in Präprozessoren verwendet, und manchmal ist eine Flucht erforderlich. |
~ nnn | Ein einzelner Charakter | nnn ist eine Oktalzahl, die den ASCII-Wert des Zeichens darstellt. |
~ t | Tab | |
~ n | Neuer Zeilen- / Zeilenvorschub | |
~ r | Wagenrücklauf | |
~ E | Flucht | |
~ b | Rücktaste | |
~ f | Formularvorschub |
Wenn Sie Tilde überhaupt anzeigen möchten, muss diese maskiert werden!
MESSAGE "A single tilde: ~~" VIEW-AS ALERT-BOX.
MESSAGE "At sign: ~100" SKIP
"Tab~tseparated~twords!" SKIP
"A linefeed:~n"
"Escaping a quote sign: ~"This is a quote!~"" SKIP VIEW-AS ALERT-BOX.