Szukaj…


Wprowadzenie

W toku ABL istnieją dwa typy ciągów, te zdefiniowane jako CHARACTER i te zdefiniowane jako LONGCHAR . Plik większy niż 32 LONGCHAR to LONGCHAR . Większość ciągów znaków, chyba że podano inaczej, bez rozróżniania wielkości liter.

Uwagi

Pamiętaj - wszystkie pozycje zaczynają się od pozycji 1!

Definiowanie, przypisywanie i wyświetlanie łańcucha

Zasadniczo należy zawsze definiować wszystkie zmienne i parametry jako NO-UNDO chyba że naprawdę potrzebujesz.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

DISPLAY cString.

Łańcuchy łączące

Za pomocą operatora + można łatwo połączyć dwa lub więcej ciągów.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

cString = cString + " " + "GOODBYE".

DISPLAY cString FORMAT "X(20)".

Manipulacja ciągiem

Istnieje kilka przydatnych wbudowanych funkcji do pracy z łańcuchem. Wszystkie funkcje pracujące z pozycją znaków zaczynają się od indeksu 1 jako pierwszego znaku, a nie 0, jak to jest często w wielu językach.

STRING - konwertuje dowolną wartość na ciąg

W tym przykładzie liczba całkowita 2000 jest konwertowana na ciąg „2000”.

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

i = 2000.

c = STRING(i).

DISPLAY c.

CHR i ASC - konwertuje pojedyncze znaki do iz ascii.

CHR (liczba całkowita)

Zwraca reprezentację znaków dla liczby całkowitej kodu ascii

ASC (znak)

Zwraca wartość całkowitą ascii dla znaku

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".

DŁUGOŚĆ - zwraca długość łańcucha

DŁUGOŚĆ (ciąg). // Zwraca liczbę całkowitą o długości ciągu.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

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

SUBSTRING - zwraca lub przypisuje część ciągu

  • SUBSTRING (ciąg, pozycja początkowa, długość).

Zwraca „długość” znaków z „łańcucha” zaczynając od pozycji „pozycja początkowa”.

  • SUBSTRING (ciąg, pozycja początkowa).

Zwraca resztę „łańcucha”, zaczynając od pozycji „pozycja początkowa”

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "ABCDEFGH".

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

Podciąg może być również użyty do zastąpienia części ciągu. Użyj tej samej składni, ale zamiast tego przypisz ten podciąg:

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

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

DISPLAY cString.  

Istnieje również podobna funkcja o nazwie OVERLAY Ten przykład z dokumentacji postępu obejmuje różnice między OVERLAY i 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.

INDEKS - zwraca pozycję ciągu w ciągu.

R-INDEX będzie to samo, ale szukaj od prawej do lewej.

INDEKS (źródło, cel)

Wyszukaj cel w źródle (od lewej do prawej) i zwróć jego pozycję. Jeśli go brakuje, zwróć 0.

INDEKS (źródło, cel, pozycja początkowa).

To samo co powyżej, ale zacznij wyszukiwanie od pozycji początkowej

DEFINE VARIABLE str AS CHARACTER   NO-UNDO.

str = "ABCDEFGH".

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

REPLACE - zastępuje ciąg w ciągu.

REPLACE (ciąg, od-ciągu, do-ciągu)

Zamienia ciąg z ciągiem na ciąg w ciągu. Długość ciągu i ciągu nie musi być tej samej długości, ciąg może także być niczym („”), aby usunąć znak.

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 - usuwa wiodące i końcowe białe spacje (lub inne znaki).

Może to być przydatne podczas czyszczenia indata.

TRIM (ciąg)

Usuwa wszystkie spacje wiodące i końcowe, tabulatory, przesunięcia wiersza, znaki powrotu karetki.

TRIM (ciąg, znak).

Usuwa wszystkie wiodące i końcowe „postacie”.

LEFT-TRIM i RIGHT-TRIM robią to samo, ale tylko na początku lub na końcu.

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 - zastępuje parametry w ciągu.

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

SUBSTITUTE (ciąg, param1, param2, ..., param9).

Parametry muszą mieć format od &1 do &9 .

Jeśli chcesz użyć ampersand w ciągu (i nie używaj go jako parametru), użyj innego 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.

Parametr może pojawić się więcej niż jeden raz w ciągu, wszystkie zostaną zastąpione:

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

Ciągi wrażliwe na wielkość liter

Wszystkie ciągi znaków w toku ABL rozróżniają małe i wielkie litery, chyba że określono inaczej.

W tym przykładzie zostanie wyświetlone okno komunikatu z informacją, że ciągi są identyczne.

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.

Aby zadeklarować rozróżnianie małych i wielkich liter, po prostu dodaj atrybut 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.

(Wystarczy, że w tym przypadku ma to jeden z ciągów).

POCZĄTKI I MECZE

POCZĄTKI - zwraca PRAWDA, jeśli jeden ciąg zaczyna się od drugiego.

string1 ROZPOCZĘCIA string2

Jeśli string1 ZACZYNA się z (lub jest równy) string2, to zwróci true. W przeciwnym razie zwróci false. Jeśli ciąg drugi jest pusty („”), zawsze zwróci true.

POCZĄTKI są bardzo przydatne w zapytaniach, w których chcesz wyszukać początek czegoś, na przykład nazwę. Ale w zasadzie jest to funkcja działająca na ciągach.

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 zwraca wartość true, jeśli określone kryterium wieloznaczne jest spełnione w ciągu.

wyrażenie string1 MATCHES

Zwraca true, jeśli string1 pasuje do wyrażenia wieloznacznego:

* (gwiazdka) = od 0 do n znaków (w zasadzie dowolny ciąg dowolnej długości)

. (kropka) = symbol wieloznaczny dla dowolnego znaku (z wyjątkiem 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

Konwersja wielkich i małych liter

Jak wspomniano wcześniej, łańcuchy zwykle nie uwzględniają wielkości liter, ale dotyczy to tylko porównania łańcuchów. Wbudowane funkcje zmiany wielkości liter.

CAPS (ciąg)

Sprawia, że ciąg jest pisany wielkimi literami

LC (ciąg)

Sprawia, że ciąg jest pisany małymi literami

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

Pamiętaj, że łańcuchy zwykle nie uwzględniają wielkości liter

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

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

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

Chyba że określony jako 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

Listy

Istnieje wiele funkcji i metod pracy z listami oddzielonymi przecinkami (lub innymi znakami) w toku 4GL.

NUM-ENTRIES Zwraca liczbę wpisów na liście. Możesz opcjonalnie określić ogranicznik, przecinek jest domyślny

NUM-ENTRIES (ciąg [, separator])

Używając przecinka, domyślny ogranicznik:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY NUM-ENTRIES(cList). //3

Używając innego separatora, semilcolon:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye;cruel;world!".

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

WEJŚCIE - funkcja - zwraca określony wpis na liście

Jak zwykle pozycja początkowa to 1, a nie 0!

WEJŚCIE (wpis, lista [, separator]).

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY ENTRY(2, cList). //cruel

WEJŚCIE - metoda - przypisanie wartości określonego wpisu na liście

WEJŚCIE (wpis, lista [, separator]) = wartość

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!

WYSZUKAJ - sprawdź listę dla konkretnego wpisu. Zwraca swój wpis.

Jeśli ciąg nie jest obecny na liście, wyszukiwanie zwróci 0

WYSZUKAJ (ciąg, lista [, separator])

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

Znaki specjalne (i ucieczka)

W toku 4GL normalnym sposobem pisania znaku specjalnego jest poprzedzenie go znakiem tyldy (~).

To są domyślne znaki specjalne

Sekwencja Interpretowane jako Komentarz
~ " Służy do pisania „łańcuchów wewnętrznych zdefiniowanych za pomocą„ łańcucha ”.
~ ' Służy do pisania „łańcuchów wewnętrznych zdefiniowanych za pomocą„ łańcucha ”.
~~ ~ Na przykład, jeśli chcesz wydrukować sekwencję, a nie jej interpretację.
~ \ \
~ { { {jest używany w procesorach wstępnych i czasami konieczne jest ucieczkę.
~ nnn Pojedyncza postać nnn jest liczbą ósemkową reprezentującą wartość ascii znaku.
~ t patka
~ n Nowa linia / linia
~ r Zwrot karetki
~ E Ucieczka
~ b Backspace
~ f Form feed

Jeśli chcesz w ogóle wyświetlać tyldy, musisz uciec!

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow