文字列へのアクセスおよび変更

この章では、Curl® 言語の文字列に関して実行できる操作のいくつかを説明します。具体的には、次の項目について説明します。

文字列へのアクセス

Curl 言語は、次の方法で文字列内の文字へのアクセスを可能にしています。

個々の文字へのアクセス

メソッド / プロシージャ
読み取り専用読み取り / 書き込み要約
getYY指定した文字を返すメソッド。
文字列内の個々の文字にアクセスするには get メソッドを使用します。文字のインデックスをメソッドに渡します。メソッドは受け取ったインデックスの文字を返します。次の例でこのメソッドを示します。

例: get メソッドの使用
{value
    || Declare and initialize a read-only string.
    let s:String = "Hello World"

    || Use "get" to return a character.
    {text The character at index 7 is... {s.get 7}}
}
次の配列構文を使用して文字列内の文字にアクセスすることもできます。
string-name[index]
ここで、string-name は文字列のオブジェクト名、index は文字のインデックスです。

例: 配列構文を使用した文字列内の文字へのアクセス
{value
    || Declare and initialize a read-only string.
    let s:String = "Hello World"

    || Use array syntax to return a character.
    {text The character at index 7 is... {value s[7]}}
}

部分文字列へのアクセス

メソッド / プロシージャ
読み取り専用読み取り / 書き込み要約
substrYY指定した位置から、指定数の文字を含む部分文字列を返すメソッド。
tailYY指定した位置と文字列の末尾の間にあるすべての文字を含む部分文字列を返すソッド。
指定した位置から指定の文字数を含む部分文字列を作成するには、substr メソッドを使用します。substr の呼び出しでは、引数として部分文字列の開始位置のインデックスと部分文字列の長さを渡します。substr メソッドは部分文字列を返します。

例: 部分文字列へのアクセス
{value
    || Declare and initialize a read-only string.
    let s1:String = "Hello World"

    || Declare and initialize another read-only string
    || that contains the substring of s1 that begins
    || at index 6 and is 5 characters long.
    let s2:String = {s1.substr 6, 5}

|| Output the value of the substring.
    {value s2}
}
文字列の指定位置と末尾の間のすべての文字を含む部分文字列を作成するには、tail メソッドを使用します。tail の呼び出しでは、引数として部分文字列の開始位置のインデックスを渡します。tail メソッドは部分文字列を返します。次に例を示します。

例: tail メソッドの使用
{value
    || Declare and initialize a read-only string.
    let s1:String = "Hello World"

    || Declare and initialize another read-only string
    || that contains the characters between index 6 and
    || the end of the string.
    let s2:String = {s1.tail 6}

    || Output the value of the substring.
    {value s2}
}
部分文字列のみを含むオブジェクトを速く作成できるように、Curl 言語には SubString クラスもあります。文字列オブジェクトを作成してそこに部分文字列を代入するより、SubString オブジェクトを作成する方が効率的です。ただし、SubString 内の文字へのアクセスは、文字列オブジェクト内の文字へのアクセスほど効率がよくありません。詳細は、『API リファレンス』で SubString を参照してください。

すべての要素へのアクセス

文字列の要素すべてにアクセスするには、コンテナ for ループを使用します。コンテナ ループの名前は、Curl® 実行環境 (RTE) がコンテナ オブジェクト (文字列や配列など) の各要素に対してループ内でコードを実行するためにこのように付けられています。コンテナ for ループを使用して、文字列内のそれぞれの文字でコードを実行します。

例: 文字列内のすべての要素へのアクセス
{value
    || Declare and initialize a read-only string.
    let s:String = "Hello World"

    || Declare an initialize a read-write string.
    let sb:StringBuf = {StringBuf "Hi, "}

    || For each character in the read-only string,
    || append the character to the read-write string.
    {for c:char in s do
        {sb.append c}
    }

    || Output the value of the read-write string.
    {value sb}
}
詳細については、『API リファレンス マニュアル』の for、および「コンテナ ループ」のセクションを参照してください。

入力ストリームへの変換

文字列内の文字にアクセスする別の方法として、文字列を文字の入力ストリームに変換してストリーム内の文字にアクセスすることができます。StringInterface.to-InputStream プロシージャを使用して文字列を TextInputStream に変換します。このメソッドについては「文字列の操作:ストリームへの変換」を参照してください。

文字列の変更

Curl 言語には、読み取りと書き込みが可能な文字列の文字を変更する方法がいくつかあります。
ただし、読み取り専用の文字列の文字は変更できません。読み取り専用の文字列の文字を変更する場合は、文字列のクローンを作成するメソッドを使用します。詳細については、「文字列クローンの操作」を参照してください。

文字の追加

メソッド / プロシージャ
読み取り専用読み取り / 書き込み要約
appendNY文字を追加するメソッド。
concatNY文字列を連結するメソッド。
insertNY指定インデックスに文字を挿入するメソッド。
write-oneNY文字を追加するメソッド。
write-one-stringNY文字列を連結するメソッド。
spliceNY指定インデックスに文字を挿入するメソッド。
文字列の末尾に文字を追加するには、append または write-one を使用します。これらのメソッドを呼び出すときに、追加する文字を指定します。append メソッドは StringInterface を継承し、write-one メソッドは TextOutputStream を継承します。
文字列オブジェクトの末尾に文字列を追加するには、concat または write-one-string を使用します。これらのメソッドを呼び出すときに、追加する文字列を指定します。concat は値を返しませんが、write-one-string は連結する文字数を返します。concat メソッドは StringInterface を継承し、write-one-string メソッドは TextOutputStream を継承します。
注意: 文字列連結演算子 (&) を使用して文字列を連結することもできます。
文字列内の指定インデックスに文字を挿入するには、insert を使用します。このメソッドを呼び出すときには、文字、インデックスの順に指定します。このメソッドは指定したインデックスに文字を挿入し、挿入位置以降のすべての文字を 1 つ右側に移動させます。
文字列オブジェクトの指定インデックスに文字列を挿入するには、splice を使用します。このメソッドを呼び出すときには、文字列、文字列を挿入する位置のインデックスの順に指定します。
次の例でこれらのメソッドを示します。

例: 文字列への文字の追加
{value
    || Declare and initialize a read-write string.
    let sb:StringBuf = {StringBuf "Hell wor"}

    || Append the character 'l' (giving "Hell worl")
    {sb.append 'l'}

    || Append the character 'd' (giving "Hell world")
    {sb.write-one 'd'}

    || Insert the character 'o' at index 4 (giving
    || "Hello world")
    {sb.insert 'o', 4}

    || Insert the string " computer " at index 5
    || (giving "Hello computer world")
    {sb.splice " computer ", 5}

    || Append the string ", here comes..." (giving
    || "Hello computer world, here comes...")
    {sb.concat ", here comes..."}

    || Append the string " Curl!" (giving "Hello
    || computer world, here comes... Curl!")
    let i:int = {sb.write-one-string " Curl!"}

    || Output the value of the read-write string.
    {value sb}
}

文字の変更

メソッド / プロシージャ
読み取り専用読み取り / 書き込み要約
setNY文字を置き換えるメソッド。
set-contentsNY内容を別の文字列の内容と置き換えるメソッド。
読み取りと書き込みが可能な文字列で個々の文字を変更するには、set メソッドを使用します。このメソッドを呼び出すときには、変更する文字のインデックス、新しい文字の順に指定します。
読み取りと書き込みが可能な文字列の内容全体を変更するには、set-contents メソッドを使用します。このメソッドを呼び出すときには、新しい内容に置き換えられる文字列を指定します。
次の例でこれらのメソッドを示します。

例: set-contents メソッドの使用
{value
    || Declare and initialize a read-write string.
    let sb:StringBuf = {StringBuf "Hello World"}

    || Replace the contents of sb.
    {sb.set-contents {StringBuf "Here comes Curl!"}}

    || Replace the character at index 5 ('c') with 'C'.
    {sb.set 5, 'C'}

    || Output the value of the read-write string.
    {value sb}
}
次の配列構文を使用して、読み取りと書き込みが可能な文字列で個々の文字を変更することもできます。
string-name[index]
ここで string-name は読み取りと書き込みが可能な文字列オブジェクト名、index は文字のインデックスです。次に例を示します。

例: set 代入ステートメントの使用
{value
    || Declare and initialize a read-write string.
    let sb:StringBuf = {StringBuf "Hello World"}

    || Replace the character at index 6 ('W') with 'w'.
    set sb[6] = 'w'

    || Output the value of the read-write string.
    {value sb}
}
もちろん、set 代入ステートメントを使用して変数値を任意に変更できます。読み取り専用、読み取りと書き込み可能の両方の文字列変数で、set 代入ステートメントを使用できます。set 代入ステートメントを使用するときは、オブジェクト内容を変更せず、新しいオブジェクトを変数に代入します。したがって、set-contentsset 代入ステートメントとその使用法が異なります。set-contents メソッドがオブジェクトの内容を変更するのに対して、set 代入ステートメントは変数値を変更します。次の例でこの違いを示します。

例: set の効果の説明
{value
    || Declare and initialize two read-write strings.
    let sb1:StringBuf = {StringBuf "Here comes Curl!"}
    let sb2:StringBuf = {StringBuf}

    || Use set to assign sb1 to sb2.
    set sb2 = sb1

    || Change a character in sb2.
    {sb2.set 5, 'C'}

    || Display sb1 and sb2.
    || Because the sb1 object is assigned to sb2, the
    || change to sb2 propagates back to sb1.
    {VBox sb1, sb2}
}

例: set-contents の効果の説明
{value
    || Declare and initialize two read-write strings.
    let sb1:StringBuf = {StringBuf "Here comes Curl!"}
    let sb2:StringBuf = {StringBuf}

    || Use set-contents to assign the contents of sb1
    || to the contents of sb2.
    {sb2.set-contents sb1}

    || Change a character in sb2.
    {sb2.set 5, 'C'}

    || Display sb1 and sb2.
    || Because the set-contents method merely sets the
    || contents of the object, the change to sb2 does not
    || propagate back to sb1.
    {VBox sb1, sb2}
}

文字の削除

メソッド / プロシージャ
読み取り専用読み取り / 書き込み要約
removeNY指定した文字を削除するメソッド。
clearNYすべての文字を削除するメソッド。
文字列から文字を削除するには、remove メソッドを使用します。このメソッドを呼び出すときには、削除する最初の文字のインデックスを指定します。連続する複数の文字を削除する場合は、文字数を length キーワード引数に代入します。文字列の内容全体を削除するには、clear メソッドを使用します。次の例でこれらのメソッドを示します。

例: remove メソッドの使用
|| Declare and initialize a read-write string.
{let sb:StringBuf = {StringBuf "Hello World"}}

|| Remove 7 characters, starting at index 2.
{sb.remove 2, length=7}

|| Output the value of the string.
{value sb}

|| Clear the string.
{sb.clear}

|| Output the value of the string.
{value sb}

文字のトリミング

メソッド / プロシージャ
読み取り専用読み取り / 書き込み要約
trimNY文字列の先頭と末尾から文字を削除するメソッド。
trim-leftNY文字列の先頭から文字を削除するメソッド。
trim-rightNY文字列の末尾から文字を削除するメソッド。
文字列から文字をトリムするには、trimtrim-left、および trim-right メソッドを使用します。これらのメソッドは、文字列の端からトリム文字でない文字の位置まで連続してトリム文字を削除します。trim は、文字列の左端と右端から文字を削除します。trim-left は左端からのみ、trim-right は右端からのみ削除します。既定ではこれらのメソッドは空白をトリミングします。他の文字をトリミングするには、trim-chars キーワード引数を使用してその文字を含む CharClass オブジェクトを渡します。CharClass オブジェクトの詳細は、「文字クラス」のセクションを参照してください。次の例はトリム メソッドを示しています。

例: trim メソッドの使用
|| Declare and initialize a read-write string.
{let sb:StringBuf = {StringBuf "  -=-Hello World!!!  "}}

|| Output the value of the string.
{value sb}
|| Note that the display of whitespace is collapsed.

|| Trim whitespace from both ends.
{sb.trim}

|| Output the value of the string.
{value sb}

|| Trim '-' and '=' characters from the left.
{sb.trim-left trim-chars="-="}

|| Output the value of the string.
{value sb}

|| Trim '!' characters from the right.
{sb.trim-right trim-chars="!"}

|| Output the value of the string.
{value sb}
クローンの作成とクローンでの文字のトリミングの詳細は、「文字列クローンの操作:文字のトリミング」を参照してください。

文字列の反転

メソッド / プロシージャ
読み取り専用読み取り / 書き込み要約
reverseNY文字列の文字を反転するメソッド。
文字列の文字を反転するには、reverse メソッドを使用します。次の例でこのメソッドを示します。

例: reverse メソッドの使用
{value
    || Declare and initialize a read-write string.
    let sb:StringBuf = {StringBuf "Hello World!"}

    || Reverse the characters in the string.
    {sb.reverse}

    || Output the value of the string.
    {value sb}
}

文字列の大文字または小文字の変更

メソッド / プロシージャ
読み取り専用読み取り / 書き込み要約
to-lowerNY文字列内の文字を小文字に変換するメソッド。
to-upperNY文字列内の文字を大文字に変換するメソッド。
文字列の文字をすべて小文字に変換するには、to-lower メソッドを使用します。文字列の文字をすべて大文字に変換するには、to-upper メソッドを使用します。次の例でこれらのメソッドを示します。

例: 文字列の大文字または小文字の変更
|| Declare and initialize a read-write string.
{let sb:StringBuf = {StringBuf "Hello World!"}}

|| Convert the characters in the string to all lowercase.
{sb.to-lower}

|| Output the value of the string.
{value sb}

|| Convert the characters in the string to all uppercase.
{sb.to-upper}

|| Output the value of the string.
{value sb}
クローンの作成およびクローンの大文字または小文字の変更については、「クローンの大文字または小文字の変更」も参照してください。