Ricerca…


introduzione

In Progress ABL ci sono due tipi di stringhe, quelle definite come CHARACTER e quelle definite come LONGCHAR . Un file più grande di 32K di lunghezza è un LONGCHAR . La maggior parte delle stringhe sono se non diversamente specificato.

Osservazioni

Ricorda: tutte le posizioni iniziano con la posizione 1!

Definizione, assegnazione e visualizzazione di una stringa

In generale, dovresti sempre definire tutte le variabili e i parametri come NO-UNDO meno che tu non ne abbia davvero bisogno.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

DISPLAY cString.

Concatenazione di stringhe

Usando l'operatore + puoi concatenare facilmente due o più stringhe.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

cString = cString + " " + "GOODBYE".

DISPLAY cString FORMAT "X(20)".

Manipolazione delle stringhe

Ci sono un paio di utili funzioni incorporate per lavorare con la stringa. Tutte le funzioni che lavorano con la posizione dei caratteri iniziano con l'indice 1 come primo carattere, non 0 come è comune in molte lingue.

STRING : converte qualsiasi valore in una stringa

Questo esempio converte il numero intero 2000 nella stringa "2000".

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

i = 2000.

c = STRING(i).

DISPLAY c.

CHR e ASC - converte i singoli caratteri da e verso ASCII.

CHR (integer)

Restituisce la rappresentazione del carattere per il numero intero del codice ASCII

ASC (carattere)

Restituisce il valore intero ascii per il carattere

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 - restituisce la lunghezza di una stringa

LUNGHEZZA (stringa). // Restituisce un numero intero con la lunghezza della stringa.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

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

SUBSTRING - restituisce o assegna una parte di una stringa

  • SUBSTRING (stringa, posizione iniziale, lunghezza).

Restituisce i caratteri "lunghezza" da "stringa" a partire dalla posizione "posizione iniziale".

  • SUBSTRING (stringa, posizione iniziale).

Restituisce il resto di "stringa", iniziando dalla posizione "posizione iniziale"

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "ABCDEFGH".

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

La sottostringa può anche essere utilizzata per sovrascrivere una parte di una stringa. Utilizza la stessa sintassi ma assegna invece la sottostringa:

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

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

DISPLAY cString.  

C'è anche una funzione simile chiamata OVERLAY questo esempio della documentazione di Progress che copre le differenze tra OVERLAY e 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.

INDICE : restituisce la posizione di una stringa in una stringa.

R-INDEX farà la stessa cosa ma cercherà da destra a sinistra.

INDICE (fonte, obiettivo)

Cerca il bersaglio all'interno della fonte (da sinistra a destra) e restituisce la sua posizione. Se manca manca 0.

INDICE (fonte, obiettivo, posizione di partenza).

Come sopra ma inizi a cercare in posizione iniziale

DEFINE VARIABLE str AS CHARACTER   NO-UNDO.

str = "ABCDEFGH".

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

SOSTITUISCI - sostituisce una stringa all'interno di una stringa.

REPLACE (stringa, da stringa, stringa)

Sostituisce da stringa con stringa in stringa. From-string e to-string non hanno bisogno di essere della stessa lunghezza, to-string può anche essere nulla ("") per rimuovere un carattere.

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 - rimuove gli spazi bianchi iniziali e finali (o altri caratteri).

Questo può essere utile quando si pulisce indata.

TRIM (string)

Rimuove tutti gli spazi iniziali e finali, le schede, i feed riga, i ritorni a capo.

TRIM (stringa, carattere).

Rimuove tutti i "personaggi" iniziali e finali.

LEFT-TRIM e RIGHT-TRIM fanno la stessa cosa ma solo in testa o in coda.

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 */

SOSTITUISCI - sostituisce i parametri in una stringa.

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

SOSTITUTO (stringa, param1, param2, ..., param9).

I parametri devono essere nel formato &1 a &9 .

Se si desidera utilizzare una e commerciale nella stringa (e non utilizzarla come parametro), sfuggire con un'altra e commerciale: && .

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.

Un parametro può apparire più di una volta in una stringa, tutto verrà sostituito:

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

Stringhe CASE-SENSIBILI

Tutte le stringhe in corso ABL sono case sensitive, salvo diversamente specificato.

Questo esempio mostrerà una finestra di messaggio che dice che le stringhe sono identiche.

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.

Per dichiarare una stringa sensibile alla maiuscola basta aggiungere l'attributo 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.

(È sufficiente che una delle stringhe ce l'abbia in questo caso).

INIZIA e MATCHES

BEGINS - restituisce TRUE se una stringa inizia con un'altra stringa.

string1 COMINCIA stringa2

Se stringa1 inizia con (o è uguale a) stringa2 questo restituirà true. Altrimenti restituirà false. Se la stringa due è vuota ("") restituirà sempre true.

BEGINS è molto utile nelle query in cui si desidera cercare l'inizio di qualcosa, ad esempio un nome. Ma è fondamentalmente una funzione che lavora su stringhe.

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 restituisce true se determinati criteri jolly vengono soddisfatti in una stringa.

stringa1 MATCHES espressione

Restituisce true se stringa1 corrisponde all'espressione con caratteri jolly:

* (asterisco) = da 0 a n caratteri (praticamente qualsiasi stringa di qualsiasi lunghezza)

. (periodo) = carattere jolly per qualsiasi carattere (eccetto 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

Conversione di lettere maiuscole e minuscole

Come accennato prima, le stringhe sono normalmente insensibili alle maiuscole e minuscole, ma riguarda solo il confronto delle stringhe. Ci sono funzioni incorporate per cambiare il caso.

CAPS (stringa)

Rende stringa maiuscola

LC (stringa)

Rende stringa minuscola

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

Ricorda che le stringhe normalmente non fanno distinzione tra maiuscole e minuscole

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

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

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

A meno che non sia specificato come 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

elenchi

Ci sono un certo numero di funzioni e metodi per lavorare con gli elenchi separati da virgola (o altri caratteri) in Progress 4GL.

NUM-ENTRIES Restituisce il numero di voci in un elenco. È possibile specificare facoltativamente il delimitatore, la virgola è predefinita

NUM-ENTRIES (stringa [, delimitatore])

Usando la virgola, il delimitatore predefinito:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY NUM-ENTRIES(cList). //3

Utilizzando un altro delimitatore, semilcolon:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye;cruel;world!".

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

ENTRY - function - restituisce una voce specificata in un elenco

Come al solito la posizione di partenza è 1, non 0!

ENTRATA (voce, lista [, delimitatore]).

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY ENTRY(2, cList). //cruel

ENTRY - metodo - assegnazione del valore di una voce specificata in una lista

ENTRATA (voce, lista [, delimitatore]) = valore

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!

CERCA - controlla un elenco per una voce specifica. Restituisce la sua voce.

Se la stringa non è presente nella lista, la ricerca restituirà 0

CERCA (stringa, lista [, delimitatore])

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

Caratteri speciali (e in fuga)

In Progress 4GL il modo normale di scrivere un carattere speciale è precederlo con un carattere tilde (~).

Questi sono i caratteri speciali predefiniti

Sequenza Interpretato come Commento
~" " Usato per scrivere "dentro stringhe definite usando" string ".
~' ' Utilizzato per scrivere 'dentro stringhe definite usando' string '.
~~ ~ Ad esempio se vuoi stampare la sequenza e non come è stata interpretata.
~ \ \
~ { { {è usato nei preprocessori e talvolta è necessario l'escape.
~ nnn Un singolo personaggio nnn è un numero ottale che rappresenta il valore ascii del personaggio.
~ t linguetta
~ n Nuova linea / linea di alimentazione
~ r Ritorno a capo
~ E Fuga
~ b Backspace
~ f Modulo di alimentazione

Se vuoi visualizzare la tilde, deve essere sfuggito!

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow