文字列

string 型は、Unicode 文字のシーケンスとして変更不可のテキストを表します。 string は .NET の System.String の別名です。

解説

文字列リテラルは引用符 (") 文字で区切られます。 特定の特殊文字をエンコードするには、円記号 ( \ ) が使用されます。 円記号とそれに続く文字はまとめて、"エスケープ シーケンス" と呼ばれます。 F# の文字列リテラルでサポートされているエスケープ シーケンスを次の表に示します。

文字 エスケープ シーケンス
アラート: \a
バックスペース \b
フォーム フィード \f
改行 \n
キャリッジ リターン \r
タブ \t
垂直タブ \v
円記号 \\
引用符 \"
アポストロフィ \'
Unicode 文字 \DDD (D は 10 進数字を示し、範囲は 000 - 255、\231 = "ç" など)
Unicode 文字 \xHH (H は 16 進数字を示し、範囲は 00 - FF、\xE7 = "ç" など)
Unicode 文字 \uHHHH (UTF-16) (H は 16 進数を示し、範囲は 0000 - FFFF、\u00E7 = "ç" など)
Unicode 文字 \U00HHHHHH (UTF-32) (H は 16 進数字を示し、範囲は 000000 - 10FFFF、\U0001F47D = "👽" など)

重要

\DDD エスケープ シーケンスは、他のほとんどの言語のような 8 進数表記ではなく、10 進表記です。 したがって、数字 89 は有効であり、\032 のシーケンスはスペース (U + 0020) を表しますが、8 進数表記では同じコード ポイントが \040 になります。

Note

0 - 255 (0xFF) の範囲に制限されているので、\DDD および \x エスケープ シーケンスは、Unicode の最初の 256 コード ポイントと一致するため、実質的に ISO-8859-1 文字セットになります。

逐語的文字列

前に @ 記号が付いている場合、リテラルは逐語的文字列になります。 逐語的文字列を宣言すると、2 つの引用符文字が 1 つの引用符文字として解釈される点を除いて、すべてのエスケープ シーケンスが無視されます。

三重引用符で囲まれた文字列

さらに、文字列を三重引用符で囲むこともできます。 この場合、2 個の引用符文字を含め、すべてのエスケープ シーケンスが無視されます。 引用符で囲まれた埋め込み文字列が含まれる文字列を指定するには、逐語的文字列または三重引用符で囲んだ文字列を使用します。 逐語的文字列を使用する場合は、単一引用符文字を示すために 2 つの引用符文字を指定する必要があります。 三重引用符で囲まれた文字列を使用する場合は、文字列の末尾として解析されることなく、単一引用符文字を使用できます。 この手法は、埋め込み引用符が含まれる XML や他の構造を操作する場合に便利です。

// Using a verbatim string
let xmlFragment1 = @"<book author=""Milton, John"" title=""Paradise Lost"">"

// Using a triple-quoted string
let xmlFragment2 = """<book author="Milton, John" title="Paradise Lost">"""

コードでは、円記号文字が改行前の最後の文字である場合を除き、改行文字を含む文字列が許可され、改行はソースで使用される改行エンコーディングとして解釈されます。 円記号が使用されている場合、次の行の先頭の空白文字は無視されます。 次のコードでは、値が "abc\ndef" である文字列 str1 と、値が "abcdef" である文字列 str2 が生成されます。

let str1 =
    "abc
def"

let str2 =
    "abc\
def"

文字列のインデックス作成とスライス

配列に似た構文を使用して、文字列内の個々の文字にアクセスできます。 次の例では、[] を使用して文字列のインデックスを作成します。 この構文は、F# 6.0 で導入されました。 また、すべてのバージョンで .[] を使用して、文字列のインデックスを作成することもできます。 新しい構文を使用することをお勧めします。

printfn "%c" str1[1]

出力は b になります。

または、次のコードに示すように、配列スライス構文を使用して部分文字列を抽出することもできます。

printfn "%s" str1[0..2]
printfn "%s" str2[3..5]

出力は次のとおりです。

abc
def

符号なしバイトの配列 (byte[] 型) によって ASCII 文字列を表すことができます。 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

文字列演算子

+ 演算子を使用すると、文字列を連結でき、.NET Framework の文字列処理機能との互換性が維持されます。 文字列の連結の例を次に示します。

let string1 = "Hello, " + "world"

String クラス

F# の文字列型は実際には .NET Framework の System.String 型であるため、すべての System.String メンバーを使用できます。 System.String には、文字列の連結に使用される + 演算子、Length プロパティ、Unicode 文字の配列として文字列を返す Chars プロパティが含まれます。 文字列の詳細については、「System.String」を参照してください。

System.StringChars プロパティを使用すると、次のコードに示すように、インデックスを指定することにより、文字列内の個々の文字にアクセスできます。

let printChar (str: string) (index: int) =
    printfn "First character: %c" (str.Chars(index))

String モジュール

文字列処理の追加機能は、FSharp.Core 名前空間の String モジュールに含まれています。 詳細については、String モジュールに関するページを参照してください。

関連項目