progress-4gl
Струны
Поиск…
Вступление
В процессе 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.