文字列 (F#)
string 型は、Unicode 文字のシーケンスとしての、変更不可のテキストを表します。 string は、.NET Framework の String のエイリアスです。
解説
リテラル文字列は引用符 (") で区切ります。 特定の特殊文字をエンコードするには、円記号 (\) を使用します。 円記号とそれに続く文字の組み合わせをエスケープ シーケンスと呼びます。 F# のリテラル文字列でサポートされるエスケープ シーケンスを次の表に示します。
文字 |
エスケープ シーケンス |
---|---|
バックスペース |
\b |
改行 |
\n |
キャリッジ リターン |
\r |
タブ |
\t |
円記号 |
\\ |
二重引用符 |
\" |
アポストロフィ |
\' |
Unicode 文字 |
\uXXXX または \UXXXXXXXX (X は 16 進数の数字を示します) |
@ 記号の後に続くリテラルは、逐語的文字列です。 この場合、2 つの引用符文字が 1 つの引用符文字として解釈されることを除いて、エスケープ シーケンスはすべて無視されます。
コードでは、改行を含む文字列はそのまま、改行は文字どおり改行として解釈されます。ただし、改行の前の最後の文字が円記号である場合を除きます。 円記号がある場合、次の行の先頭にある空白は無視されます。 次のコードは、値 "abc\r\n def" を持つ文字列 str1 と、値 "abcdef" を持つ文字列 str2 を生成します。
let str1 = "abc
def"
let str2 = "abc\
def"
文字列を使用するとき、F# は改行文字を検出したとおりに保持します。このため、文字列を読み込むファイルに改行文字としてライン フィード (LF、\n のこと) または復帰とライン フィード (CRLF、\r\n のこと) のどちらが含まれるにしても、それらは保持されます。
配列に似た次のような構文を使用して、文字列内の各文字にアクセスできます。
printfn "%c" str1.[1]
出力は b になります。
また、次のコードに示すように、配列スライスの構文を使用して部分文字列を抽出できます。
printfn "%s" (str1.[0..2])
printfn "%s" (str2.[3..5])
出力は次のとおりです。
abc
def
ASCII 文字列は、符号なしバイトの配列である byte[] 型で表すことができます。 リテラル文字列が ASCII 文字列であることを示すには、サフィックス B を追加します。 バイト配列を使用した ASCII リテラル文字列では、Unicode 文字列と同じエスケープ シーケンスがサポートされます (Unicode エスケープ シーケンスは除く)。
// "abc" interpreted as a Unicode string.
let str1 : string = "abc"
// "abc" interpreted as an ASCII byte array.
let bytearray : byte[] = "abc"B
文字列演算子
文字列を連結するには、+ 演算子または ^ 演算子を使用する 2 つの方法があります。 + 演算子を使用すると、.NET Framework の文字列処理機能との互換性が維持されます。
文字列の連結の例を次に示します。
let string1 = "Hello, " + "world"
String クラス
F# の文字列型は実際には .NET Framework の String 型であるため、すべての String のメンバーを使用できます。 これには、+ 演算子 (文字列を連結するために使用される)、Length プロパティ、および Chars プロパティ (文字列を Unicode 文字の配列として返す) が含まれます。 文字列の詳細については、「String」を参照してください。
String の Chars プロパティを使用すると、次のコードに示すように、インデックスを指定して文字列中の各文字にアクセスできます。
let printChar (str : string) (index : int) =
printfn "First character: %c" (str.Chars(index))
String モジュール
文字列を処理するためのその他の機能は、FSharp.Core 名前空間の String モジュールに含まれています。 詳細については、「Core.String モジュール (F#)」を参照してください。