Поиск…


Вступление

В процессе ABL существует два типа строк, которые определены как CHARACTER и те, которые определены как LONGCHAR . Файл размером более 32K является LONGCHAR . Большинство строк, если не указано иное, нечувствительны к регистру.

замечания

Помните - все позиции начинаются с позиции 1!

Определение, определение и отображение строки

Как правило, вы должны всегда определять всю переменную и параметры как NO-UNDO если вам это действительно нужно.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

DISPLAY cString.

Конкатенация строк

Используя оператор + вы можете легко объединить две или более строки.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

cString = cString + " " + "GOODBYE".

DISPLAY cString FORMAT "X(20)".

Строчная манипуляция

Для работы со строкой существует несколько полезных встроенных функций. Все функции, работающие с позицией символов, начинаются с индекса 1 как первого символа, а не 0, как это принято на многих языках.

STRING - преобразует любое значение в строку

Этот пример преобразует целое число 2000 в строку «2000».

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

i = 2000.

c = STRING(i).

DISPLAY c.

CHR и ASC - преобразует одиночные символы в и из ascii.

CHR (целое число)

Возвращает представление символа для целых чисел ascii

ASC (характер)

Возвращает целочисленное значение ascii для символа

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 - возвращает длину строки

LENGTH (строка). // Возвращает целое число с длиной строки.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

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

SUBSTRING - возвращает или присваивает часть строки

  • SUBSTRING (строка, начальная позиция, длина).

Возвращает символы «длины» из «строки», начиная с позиции «начальная позиция».

  • SUBSTRING (строка, начальная позиция).

Возвращает оставшуюся часть "string", начиная с позиции "start-position"

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "ABCDEFGH".

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

Подстроку можно также использовать для перезаписи части строки. Используйте тот же синтаксис, но вместо этого назначьте эту подстроку:

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

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

DISPLAY cString.  

Аналогичная функция называется OVERLAY этот пример из документации Progress содержит информацию о различиях между OVERLAY и 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 - возвращает позицию строки в строке.

R-INDEX будет делать то же самое, но поиск справа налево.

ИНДЕКС (источник, цель)

Найдите цель внутри источника (слева направо) и верните ее позицию. Если ему не хватает возврата 0.

INDEX (источник, цель, начальная позиция).

То же, что и выше, но начать поиск в исходном положении

DEFINE VARIABLE str AS CHARACTER   NO-UNDO.

str = "ABCDEFGH".

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

REPLACE - заменяет строку внутри строки.

REPLACE (строка, from-string, to-string)

Заменяет строку на строку в строку. Из-string и to-string не должна быть одинаковой длины, to-string также может быть ничего ("") для удаления символа.

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 - удаляет ведущие и конечные пробелы (или другие символы).

Это может быть полезно при очистке индата.

TRIM (строка)

Удаляет все начальные и конечные пробелы, вкладки, фиды строк, возврат каретки.

TRIM (строка, символ).

Удаляет все ведущие и завершающие символы.

LEFT-TRIM и RIGHT-TRIM делают то же самое, но только ведущее или конечное.

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 - заменяет параметры в строке.

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

SUBSTITUTE (строка, param1, param2, ..., param9).

Параметры должны быть в формате от &1 до &9 .

Если вы хотите использовать амперсанд в строке (и не использовать его в качестве параметра), берите его с помощью другого амперсанда: && .

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.

Параметр может появляться более одного раза в строке, все они будут заменены:

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

CASE-SENSITIVE строки

Все строки в процессе ABL чувствительны к регистру, если не указано иное.

В этом примере отобразится окно с сообщением о том, что строки идентичны.

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.

Чтобы объявить строковый регистр чувствительным, вы просто добавляете атрибут 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.

(Достаточно, чтобы одна из строк имела в этом случае).

НАЧИНАЕТСЯ И МАТЧА

BEGINS - возвращает TRUE, если одна строка начинается с другой строки.

string1 BEGINS string2

Если string1 BEGINS с (или равно) string2, это вернет true. В противном случае он вернет false. Если строка 2 пуста (""), она всегда будет возвращать значение true.

BEGINS очень полезен в запросах, где вы хотите найти начало чего-то, например имя. Но это в основном функция, работающая с строками.

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 возвращает true, если определенная кривая группового символа встречается в строке.

Строковое выражение MATCHES

Возвращает true, если string1 соответствует выражению подстановки:

* (asterisk) = от 0 до n символов (в основном любая строка любой длины)

, (период) = подстановочный знак для любого символа (кроме нуля)

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

Преобразование верхнего и нижнего регистров

Как упоминалось ранее, строки обычно нечувствительны к регистру, но это касается только сравнения строк. Там встроены функции для изменения корпуса.

CAPS (строка)

Делает строчный верхний регистр

LC (строка)

Делает строчный строчный регистр

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

Помните, что строки обычно нечувствительны к регистру

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

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

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

Если не указано 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

Списки

Существует ряд функций и методов для работы с разделенными запятыми (или другими символами) списками в Progress 4GL.

NUM-ENTRIES Возвращает количество записей в списке. Вы можете дополнительно указать разделитель, запятая по умолчанию

NUM-ENTRIES (строка [, разделитель])

Использование запятой, разделитель по умолчанию:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY NUM-ENTRIES(cList). //3

Используя другой разделитель, semilcolon:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye;cruel;world!".

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

ENTRY - функция - возвращает указанную запись в списке

Как обычно, начальная позиция равна 1, а не 0!

ENTRY (запись, список [, разделитель]).

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY ENTRY(2, cList). //cruel

ENTRY - метод - присвоение значения указанной записи в списке

ENTRY (запись, список [, разделитель]) = значение

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 - проверить список для определенной записи. Возвращает его.

Если строка отсутствует в списке, то возвращается 0

LOOKUP (строка, список [, разделитель])

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

Специальные символы (и экранирование)

В процессе 4GL обычным способом записи специального символа является предикация символа тильды (~).

Это специальные символы по умолчанию

Последовательность Интерпретируется как Комментарий
" Используется для записи «внутренних строк, определенных с помощью« строки ».
' Используется для записи 'внутри строк, определенных с помощью' string '.
~~ ~ Например, если вы хотите напечатать последовательность, а не ее интерпретацию.
~ \ \
~ { { {используется в препроцессорах, а иногда требуется экранирование.
~ NNN Один символ nnn - восьмеричное число, представляющее значение ascii символа.
~ т табуляция
~ п Новая линия / линия
~ г Возврат каретки
~ E Побег
~ б возврат на одну позицию
~ е Подача формы

Если вы хотите отобразить тильду вообще, ее нужно сбежать!

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow