サーチ…


前書き

進行中のABLには、 CHARACTERLONGCHARとして定義された2種類の文字列があります。長さが32Kを超えるファイルはLONGCHARです。ほとんどの文字列は、大文字と小文字を区別しない方法で指定しない限りありません

備考

覚えておいてください - すべてのポジションはポジション1から始まります!

文字列の定義、検査、表示

一般に、本当に必要な場合を除いて、すべての変数とパラメータをNO-UNDOとして定義する必要があります。

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

DISPLAY cString.

文字列の連結

+演算子を使用すると、2つ以上の文字列を簡単に連結できます。

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.

CHRASC - 1文字を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(文字列、開始位置)。

"start-position"の位置から始まる残りの "string"を返します。

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という類似の関数もありますOVERLAYドキュメントのこの例は、 OVERLAYSUBSTRING違いを扱っています。

/* 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は同じことになりますが、右に向かって検索します。

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)

from-stringをto-stringに置き換えます。 From-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-TRIMRIGHT-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文字列

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

(この場合は、文字列の1つで十分です)。

始まりと一致

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は真を返します。

string1 MATCHES式

string1がワイルドカード式に一致する場合はtrueを返します。

*(アスタリスク)= 0〜n文字(基本的に任意の長さの任意の文字列)

。 (ピリオド)=任意の文字のワイルドカード(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

大文字と小文字の変換

前述のように、文字列は通常大文字小文字を区別しませんが、文字列の比較のみを考慮します。ケースを変更するための関数が組み込まれています。

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

リスト

進捗状況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"を使用して定義された文字列の内側に書き込むために使用されます。
〜 ' ' 'string'を使用して定義された文字列の内側に書き込むために使用されます。
~~ たとえば、シーケンスを印刷し、その解釈方法が印刷されないようにする場合などです。
〜\ \
〜{ { {はプリプロセッサで使用され、時にはエスケープが必要です。
〜nnn 1文字 nnnは文字のアスキー値を表す8進数です。
〜t タブ
〜n 改行/改行
〜r キャリッジリターン
〜E エスケープ
〜b バックスペース
〜f フォームフィード

ティルダをすべて表示したい場合は、それをエスケープする必要があります。

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