Sök…


Introduktion

I Progress ABL finns det två typer av strängar, de definierade som CHARACTER och de som definieras som LONGCHAR . En fil som är större än 32K är en LONGCHAR . De flesta strängar är om inte något annat sätt är känslig.

Anmärkningar

Kom ihåg - alla positioner börjar med position 1!

Definiera, analysera och visa en sträng

Generellt sett bör du alltid definiera alla variabler och parametrar som NO-UNDO om du inte behöver det.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

DISPLAY cString.

Slå samman strängar

Med hjälp av + -operatören kan du enkelt sammanfoga två eller flera strängar.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

cString = cString + " " + "GOODBYE".

DISPLAY cString FORMAT "X(20)".

Strängmanipulation

Det finns ett par användbara inbyggda funktioner för att arbeta med sträng. Alla funktioner som arbetar med teckenpositionen börjar med index 1 som första tecken, inte 0 som är vanligt på många språk.

STRING - konverterar alla värden till en sträng

Detta exempel konverterar heltal 2000 till strängen "2000".

DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

i = 2000.

c = STRING(i).

DISPLAY c.

CHR och ASC - konverterar enstaka tecken till och från ascii.

CHR (heltal)

Returnerar teckenrepresentationen för heltal för ascii-kod

ASC (tecken)

Returnerar ascii-heltalet för tecknet

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 - returnerar längden på en sträng

LÄNGD (sträng). // Returnerar ett heltal med strängens längd.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

MESSAGE "The string " cString " is " LENGTH(cString) " characters long" VIEW-AS ALERT-BOX. 

SUBSTRING - returnerar eller tilldelar en del av en sträng

  • SUBSTRING (sträng, startposition, längd).

Returnerar "längd" -tecken från "sträng" som börjar på position "startposition".

  • SUBSTRING (sträng, startposition).

Returnerar resten av "sträng", börjar vid position "startposition"

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "ABCDEFGH".

DISPLAY SUBSTRING(cString, 4, 2). //Displays "DE" 
DISPLAY SUBSTRING(cString, 4). //Displays "DEFGH"

Substring kan också användas för att skriva över en del av en sträng. Använd samma syntax men tilldela istället den substring:

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "ABCDEFGH".
 
SUBSTRING(cString, 4, 2) = "XY". //Replaces position 4 and 5 with "XY" 

DISPLAY cString.  

Det finns också en liknande funktion som kallas OVERLAY Detta exempel från framstegsdokumentationen täcker skillnaderna mellan OVERLAY och 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 - returnera positionen för en sträng i en sträng.

R-INDEX kommer till samma sak men sök höger till vänster.

INDEX (källa, mål)

Sök i källan (från vänster till höger) och returnera dess position. Om det saknas returnera 0.

INDEX (källa, mål, startposition).

Samma som ovan men börja söka i startpositionen

DEFINE VARIABLE str AS CHARACTER   NO-UNDO.

str = "ABCDEFGH".

DISPLAY INDEX(str, "cd") INDEX(str, "cd", 4). //Will display 3 and 0

Byt ut - ersätter en sträng inom en sträng.

Byt ut (sträng, från-sträng, till-sträng)

Ersätter från sträng till sträng i sträng. Från sträng och sträng behöver inte vara av samma längd, till-strängen kan också vara ingenting ("") för att ta bort ett tecken.

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 - tar bort ledande och efterföljande blanksteg (eller andra tecken).

Detta kan vara användbart vid rengöring av indata.

TRIM (sträng)

Tar bort alla ledande och efterföljande utrymmen, flikar, radmatningar, vagnen återgår.

TRIM (sträng, tecken).

Tar bort alla ledande och efterföljande "karaktärer".

LEFT-TRIM och RIGHT-TRIM gör samma sak men bara leder eller släpar.

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 - ersätter parametrar i en sträng.

SUBSTITUTE is a limited function for replacing up to nine preformatted parameters in a string.

SUBSTITUTE (sträng, param1, param2, ..., param9).

Parametrarna måste vara i formatet &1 till &9 .

Om du vill använda en ampersand i strängen (och inte använda den som en parameter) flyr den med en annan ampersand: && .

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.

En parameter kan visas mer än en gång i en sträng, alla kommer att ersättas:

MESSAGE SUBSTITUTE("&1 &2 or not &1 &2", "To", "Be") VIEW-AS ALERT-BOX.

CASE-Känsliga strängar

Alla strängar i Progress ABL är skiftlägeskänsliga om inte annat anges.

Detta exempel visar en meddelanderuta som säger att strängarna är identiska.

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.

För att förklara en CASE-SENSITIVE lägger du bara till attributet 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.

(Det räcker med att en av strängarna har det i det här fallet).

BEGYNGAR och MATCHES

BEGINS - returnerar SANT om en sträng börjar med en annan sträng.

string1 BEGINS string2

Om sträng1 BEGINS med (eller är lika med) sträng2 kommer detta att returnera true. Annars kommer det att returnera falskt. Om sträng två är tom ("") kommer den alltid att gälla.

BEGINS är mycket användbart i frågor där du vill söka i början på något, till exempel ett namn. Men det är i princip en funktion som arbetar med strängar.

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 returnerar sant om vissa jokertecken är uppfyllda i en sträng.

string1 MATCHES uttryck

Returnerar sant om sträng1 matchar jokerteckenuttrycket:

* (asterisk) = 0 till n tecken (i princip någon sträng av vilken längd som helst)

. (period) = jokertecken för alla tecken (utom noll)

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

Konvertera stora och små bokstäver

Som nämnts tidigare är strängar normalt okänsliga för fall men det gäller endast jämförelse av strängar. Det finns inbyggda funktioner för att ändra ärende.

CAPS (sträng)

Gör strängbokstäver

LC (sträng)

Gör sträng med små bokstäver

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

Kom ihåg att strängar normalt är okänsliga för versaler

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.
DEFINE VARIABLE d AS CHARACTER   NO-UNDO.

c = "hello".
d = "hello".

DISPLAY CAPS(c) = LC(d). // yes

Om inte specificeras som 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

listor

Det finns ett antal funktioner och metoder för att arbeta med komma (eller annat tecken) separerade listor i Progress 4GL.

NUM-ENTRIES Returnerar antalet poster i en lista. Du kan valfritt ange avgränsare, komma är standard

NUM-ENTRIES (string [, delimiter])

Med kommatecken är standardavgränsaren:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY NUM-ENTRIES(cList). //3

Med hjälp av en annan avgränsare, semilcolon:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye;cruel;world!".

DISPLAY NUM-ENTRIES(cList, ";"). //3

ENTRY - funktion - returnerar en angiven post i en lista

Som vanligt startposition är 1, inte 0!

ENTRY (post, lista [, avgränsare]).

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY ENTRY(2, cList). //cruel

ENTRY - metod - tilldela värdet på en specificerad post i en lista

ENTRY (post, lista [, delimiter]) = värde

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 - kolla en lista för en specifik post. Returnerar posten.

Om strängen inte finns i listuppslaget returnerar 0

LOOKUP (sträng, lista [, avgränsare])

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

Specialtecken (och fly)

I Progress 4GL är det vanliga sättet att skriva ett specialtecken att föregå det med ett tilde-tecken (~).

Dessa är standard specialtecken

Sekvens Tolkas som Kommentar
~" " Används för att skriva "inuti strängar definierade med" sträng ".
~' ' Används för att skriva "inuti strängar definierade med" sträng ".
~~ ~ Till exempel om du vill skriva ut sekvensen och inte hur den tolkas.
~ \ \
~ { { {används i förbehandlare och ibland behövs rymning.
~ nnn En enda karaktär nnn är ett oktaltal som representerar karaktärets asciivärde.
~ t flik
~ n Ny linje / radmatning
~ r Vagnretur
~ E Fly
~ b Backspace
~ f Forma foder

Om du överhuvudtaget vill visa tilde måste det rymmas!

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.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow