progress-4gl
strings
Zoeken…
Invoering
In uitvoering ABL zijn er twee soorten strings, die zijn gedefinieerd als CHARACTER
en die zijn gedefinieerd als LONGCHAR
. Een bestand dat groter is dan 32K is een LONGCHAR
. De meeste tekenreeksen zijn, tenzij anders vermeld, hoofdletterongevoelig.
Opmerkingen
Onthoud - alle posities beginnen met positie 1!
Een string definiëren, beoordelen en weergeven
Over het algemeen moet u altijd alle variabelen en parameters definiëren als NO-UNDO
tenzij u dit echt nodig hebt.
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "HELLO".
DISPLAY cString.
Tekenreeksen samenvoegen
Met de operator +
kunt u eenvoudig twee of meer strings samenvoegen.
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "HELLO".
cString = cString + " " + "GOODBYE".
DISPLAY cString FORMAT "X(20)".
String manipulatie
Er zijn een aantal handige ingebouwde functies voor het werken met tekenreeksen. Alle functies die werken met de positie van tekens beginnen met index 1 als het eerste teken, niet 0 zoals in veel talen gebruikelijk is.
STRING - converteert elke waarde naar een string
Dit voorbeeld converteert het gehele getal 2000 naar de tekenreeks "2000".
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
i = 2000.
c = STRING(i).
DISPLAY c.
CHR en ASC - converteert enkele tekens van en naar ASCII.
CHR (integer)
Retourneert de karakterrepresentatie voor ascii code integer
ASC (teken)
Retourneert de ascii-integerwaarde voor het teken
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".
LENGTE - geeft de lengte van een string terug
LENGTE (string). // Retourneert een geheel getal met de lengte van de tekenreeks.
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "HELLO".
MESSAGE "The string " cString " is " LENGTH(cString) " characters long" VIEW-AS ALERT-BOX.
SUBSTRING - retourneert of wijst een deel van een string toe
- SUBSTRING (string, startpositie, lengte).
Retourneert "lengte" -tekens uit "string" beginnend op positie "startpositie".
- SUBSTRING (string, startpositie).
Retourneert de rest van "string", beginnend bij positie "startpositie"
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "ABCDEFGH".
DISPLAY SUBSTRING(cString, 4, 2). //Displays "DE"
DISPLAY SUBSTRING(cString, 4). //Displays "DEFGH"
Substring kan ook worden gebruikt om een deel van een string te overschrijven. Gebruik dezelfde syntaxis maar wijs in plaats daarvan die substring toe:
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
cString = "ABCDEFGH".
SUBSTRING(cString, 4, 2) = "XY". //Replaces position 4 and 5 with "XY"
DISPLAY cString.
Er is ook een vergelijkbare functie genaamd OVERLAY
Dit voorbeeld uit de Progress-documentatie behandelt de verschillen tussen OVERLAY
en 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 - geeft de positie van een string in een string terug.
R-INDEX
zal hetzelfde doen, maar van rechts naar links zoeken.
INDEX (bron, doel)
Zoek doel in bron (van links naar rechts) en geef zijn positie terug. Als het ontbreekt, geef dan 0 terug.
INDEX (bron, doel, startpositie).
Hetzelfde als hierboven, maar begin met zoeken op startpositie
DEFINE VARIABLE str AS CHARACTER NO-UNDO.
str = "ABCDEFGH".
DISPLAY INDEX(str, "cd") INDEX(str, "cd", 4). //Will display 3 and 0
VERVANG - vervangt een string binnen een string.
REPLACE (string, van-string, naar-string)
Vervangt van-string naar naar-string in string. From-string en to-string hoeven niet dezelfde lengte te hebben, to-string kan ook niets ("") zijn om een karakter te verwijderen.
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 - verwijdert voorloop- en volgspaties (of andere tekens).
Dit kan handig zijn bij het opschonen van indata.
TRIM (string)
Verwijdert alle voorloop- en volgspaties, tabbladen, lijnfeeds, regelterugloop.
TRIM (tekenreeks, teken).
Verwijdert alle voorloop- en volg "karakters".
LEFT-TRIM
en RIGHT-TRIM
hetzelfde, maar alleen leiden of volgen.
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 */
VERVANGEN - vervangt parameters in een string.
SUBSTITUTE is a limited function for replacing up to nine preformatted parameters in a string.
VERVANGEN (string, param1, param2, ..., param9).
De parameters moeten de notatie &1
tot &9
.
Als u een en-teken in de tekenreeks wilt gebruiken (en dit niet als parameter wilt gebruiken), kunt u dit ontsnappen met een ander en-teken: &&
.
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.
Een parameter kan meerdere keren in een string voorkomen, alle worden vervangen:
MESSAGE SUBSTITUTE("&1 &2 or not &1 &2", "To", "Be") VIEW-AS ALERT-BOX.
CASE-SENSITIVE-tekenreeksen
Alle strings in Progress ABL zijn hoofdlettergevoelig, tenzij anders aangegeven.
In dit voorbeeld wordt een berichtvenster weergegeven waarin staat dat de tekenreeksen identiek zijn.
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.
Om een tekenreeks hoofdlettergevoelig te verklaren, voegt u gewoon het kenmerk 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.
(Het is voldoende dat een van de tekenreeksen het in dit geval heeft).
BEGINT EN WEDSTRIJDEN
BEGINS - geeft WAAR terug als een string begint met een andere string.
string1 BEGINT string2
Als string1 BEGINSELT met (of gelijk is aan) string2, geeft dit true terug. Anders zal het onwaar terugkeren. Als string twee leeg is (""), zal deze altijd true retourneren.
BEGINS is erg handig in zoekopdrachten waarbij u het begin van iets wilt zoeken, bijvoorbeeld een naam. Maar het is eigenlijk een functie die werkt op strings.
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 retourneert true als aan bepaalde jokertekens in een string wordt voldaan.
string1 MATCHES expressie
Retourneert true als string1 overeenkomt met de jokertekenuitdrukking:
* (asterisk) = 0 tot n tekens (in principe elke string van elke lengte)
. (punt) = jokerteken voor elk teken (behalve 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
Hoofdletters en kleine letters omzetten
Zoals eerder vermeld, zijn tekenreeksen normaal niet hoofdlettergevoelig, maar dat geldt alleen voor vergelijking van tekenreeksen. Er zijn ingebouwde functies voor het veranderen van geval.
CAPS (string)
Hiermee maakt u een tekenreeks in hoofdletters
LC (string)
Hiermee maakt u tekenreeks kleine letters
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
Onthoud dat tekenreeksen normaal niet hoofdlettergevoelig zijn
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
DEFINE VARIABLE d AS CHARACTER NO-UNDO.
c = "hello".
d = "hello".
DISPLAY CAPS(c) = LC(d). // yes
Tenzij gespecificeerd 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
lijsten
Er zijn een aantal functies en methoden voor het werken met door komma's (of andere tekens) gescheiden lijsten in Progress 4GL.
NUM-ENTRIES Retourneert het aantal items in een lijst. U kunt desgewenst scheidingsteken opgeven, komma is standaard
NUM-ENTRIES (string [, scheidingsteken])
Met komma, het standaardscheidingsteken:
DEFINE VARIABLE cList AS CHARACTER NO-UNDO.
cList = "Goodbye,cruel,world!".
DISPLAY NUM-ENTRIES(cList). //3
Met een ander scheidingsteken, puntkomma:
DEFINE VARIABLE cList AS CHARACTER NO-UNDO.
cList = "Goodbye;cruel;world!".
DISPLAY NUM-ENTRIES(cList, ";"). //3
INGANG - functie - retourneert een opgegeven item in een lijst
Zoals gebruikelijk is de startpositie 1, niet 0!
INGANG (vermelding, lijst [, scheidingsteken]).
DEFINE VARIABLE cList AS CHARACTER NO-UNDO.
cList = "Goodbye,cruel,world!".
DISPLAY ENTRY(2, cList). //cruel
TOEGANG - methode - toewijzen van de waarde van een opgegeven item in een lijst
INGANG (invoer, lijst [, scheidingsteken]) = waarde
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!
ZOEKEN - controleer een lijst voor een specifiek item. Retourneert zijn invoer.
Als de string niet in de lijst voorkomt, retourneert lookup 0
ZOEKEN (tekenreeks, lijst [, scheidingsteken])
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
Speciale tekens (en ontsnappen)
In Progress 4GL is de normale manier om een speciaal teken te schrijven het voorafgaan door een tilde-teken (~).
Dit zijn de standaard speciale tekens
Volgorde | Geïnterpreteerd als | Commentaar |
---|---|---|
~" | " | Wordt gebruikt om "binnen strings te schrijven die zijn gedefinieerd met" string ". |
~' | ' | Wordt gebruikt om 'binnen strings te schrijven die zijn gedefinieerd met' string '. |
~~ | ~ | Als u bijvoorbeeld de reeks wilt afdrukken en niet hoe deze wordt geïnterpreteerd. |
~ \ | \ | |
~ { | { | {wordt gebruikt in preprocessors en soms is ontsnappen nodig. |
~ nnn | Een enkel karakter | nnn is een octaal getal dat de ascii-waarde van het teken vertegenwoordigt. |
~ t | tab | |
~ n | Nieuwe lijn / lijn feed | |
~ r | Vervoer terug | |
~ E | Ontsnappen | |
~ b | Backspace | |
~ f | Form feed |
Als je tilde helemaal wilt tonen, moet het ontsnapt zijn!
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.