ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

string 配列に関するよくある質問

MATLAB® は、R2016b で string データ型を導入しました。R2018b より、string 配列を使用して MathWorks® 製品全体でテキストを扱うことができるようになりました。string 配列は、テキストを格納し、テキストをデータとして処理するための一連の関数を提供します。string 配列は、他のタイプの配列と同じようにインデックス付け、形状変更および連結を行えます。詳細については、string 配列の作成を参照してください。

多くの点で、string 配列は文字ベクトルおよび文字ベクトルの cell 配列と同様に動作します。ただし、string 配列と文字配列の間には、予期しない結果につながる可能性のある重要な違いがいくつかあります。これらの違いのそれぞれについて、予想どおりの結果に導くために推奨される string の使用方法があります。

コマンド形式で string を使用するとエラーが返される理由

cddircopyfileload などの関数をコマンド形式で使用する場合は、二重引用符の使用を避けてください。コマンド形式では、二重引用符で囲まれた引数によってエラーが発生する可能性があります。引数を string として指定するには、関数形式を使用します。

コマンド構文では、コンマではなくスペースで入力を区切ります。また、入力引数を小かっこで囲むことはありません。たとえば、コマンド構文では関数 cd を使用してフォルダーを変更できます。

cd C:\Temp

テキスト C:\Temp は文字ベクトルです。コマンド形式では、すべての引数が常に文字ベクトルになります。フォルダー名など、スペースを含む引数がある場合は、それを一重引用符で囲んで 1 つの入力引数として指定します。

cd 'C:\Program Files'

しかし、二重引用符を使用して引数を指定すると、cd はエラーをスローします。

cd "C:\Program Files"
Error using cd
Too many input arguments.

エラー メッセージは、使用する関数と指定する引数に応じて変わる場合があります。たとえば、コマンド構文で関数 load を使用し、二重引用符を使用して引数を指定すると、load が別のエラーをスローします。

load "myVariables.mat"
Error using load
Unable to read file '"myVariables.mat"': Invalid argument.

コマンド形式で、二重引用符は、string 構成演算子としてではなくリテラル テキストの一部として扱われます。cd "C:\Program Files" と同等のものを関数形式で記述すると、2 つの引数を持つ cd の呼び出しのようになります。

cd('"C:\Program','Files"')

引数を string として指定する場合は、関数構文を使用します。コマンド構文をサポートするすべての関数は、関数構文もサポートします。たとえば、関数構文で cd と二重引用符で囲んだ string の入力引数を使用できます。

cd("C:\Program Files")

cell 配列内の string でエラーが返される理由

複数の string がある場合、それらを cell 配列 "ではなく"、string 配列で保存します。中かっこではなく、大かっこを使用して string 配列を作成します。string 配列は、テキストの保存および操作では cell 配列より効率的です。

str = ["Venus","Earth","Mars"]
str = 1×3 string array
    "Venus"    "Earth"    "Mars"

string の cell 配列の使用は避けてください。cell 配列を使用すると、string 配列の使用によるパフォーマンス上のメリットを得ることはできません。実際、ほとんどの関数は string の cell 配列を入力引数、オプション、または名前と値のペアの値として受け入れません。たとえば、string の cell 配列を入力引数として指定すると、関数 contains はエラーをスローします。

C = {"Venus","Earth","Mars"}
C = 1×3 cell array
    {["Venus"]}    {["Earth"]}    {["Mars"]}
TF = contains(C,"Earth")
Error using contains
First argument must be a string array, character vector, or cell array of character vectors.

代わりに、引数を string 配列として指定します。

str = ["Venus","Earth","Mars"];
TF = contains(str,"Earth");

R2016b より前は、"string の cell 配列" という用語は、その要素すべてが文字ベクトルである cell 配列を意味していました。ただし、これらの cell 配列は、string 配列と区別するために、"文字ベクトルの cell 配列" と呼ぶ方が正確です。

cell 配列には、string を含む任意のデータ型を持つ変数を含めることができます。その要素すべてが string である cell 配列の作成はいまだに可能です。また、文字ベクトルの cell 配列をコード内に既に指定している場合、一重引用符の二重引用符への置き換えは単純な更新のように見えるかもしれません。しかし、string の cell 配列の作成や使用は推奨されません。

string の length() が 1 を返す理由

文字ベクトルの文字数の確認には通常、関数 length を使用します。しかし、string の文字数を求めるには、length ではなく、関数 strlength を使用します。

一重引用符を使用して文字ベクトルを作成します。その長さを判断するには、関数 length を使用します。C はベクトルのため、その長さは文字数と一致します。C は 1 行 11 列のベクトルです。

C = 'Hello world';
L = length(C)
L = 11

二重引用符を使用して同じ文字から成る string を作成します。それには 11 文字が含まれていますが、str は 1 行 1 列の string 配列、つまり "string スカラー" です。string スカラーについて length を呼び出すと、格納されている文字数に関係なく、出力引数は 1 となります。

str = "Hello World";
L = length(str)
L = 1

string 内の文字数を求めるには、R2016b に導入された関数 strlength を使用します。互換性が確保されるよう、strlength は文字ベクトルについても同様に動作します。どちらの場合も、strlength は文字数を返します。

L = strlength(C)
L = 11
L = strlength(str)
L = 11

複数の string を含む string 配列や、文字ベクトルの cell 配列にも strlength を使用できます。

関数 length は、配列の最も長い次元のサイズを返します。string 配列の場合、length は、配列の最長次元に沿った "string" の数を返します。string "内" の文字数は返しません。

isempty("") が 0 を返す理由

string は文字を含まない場合があります。このような string は "空の string" です。空の string は空の二重引用符ペアを使用して指定できます。

L = strlength("")
L = 0

ただし、空の string は空の配列では "ありません"。空の string は、文字がない状態の string スカラーです。

sz = size("")
sz = 1×2    
     1     1

空の string について isempty を呼び出すと、string は空の配列ではないため、0 (false) が返されます。

tf = isempty("")
tf = logical
   0

しかし、空の文字配列について isempty を呼び出した場合は、1 (true) が返されます。空の一重引用符ペアとして指定された文字配列 '' は 0 行 0 列の文字配列です。

tf = isempty('')
tf = logical
   1

テキスト部分に文字がないことを調べるには、関数 strlength の使用が最適です。入力が string スカラーまたは文字ベクトルのどちらでも同じ呼び出しを使用できます。

str = "";
if strlength(str) == 0
    disp('String has no text')
end
String has no text
chr = '';
if strlength(chr) == 0
    disp('Character vector has no text')
end
Character vector has no text

大かっこを使用した string の付加で複数の string が返される理由

大かっこを使用するとテキストを文字ベクトルの末尾に付加できます。しかし、大かっこを使用してテキストを string 配列に追加すると、新しいテキストは string 配列の新しい要素として連結されます。テキストを string の後に付加するには、plus 演算子または関数 strcat を使用します。

たとえば、2 つの string を連結すると、結果は 1 行 2 列の string 配列になります。

str = ["Hello" "World"]
str = 1×2 string array
    "Hello"    "World"

しかし、2 つの文字ベクトルを連結すると、結果は長い文字ベクトルになります。

str = ['Hello' 'World']
chr = 'HelloWorld'

テキストを string (または string 配列の要素) の後に付加するには、大かっこではなく plus 演算子を使用します。

str = "Hello" + "World"
str = "HelloWorld"

この他には、関数 strcat が使用できます。strcat は入力引数が string または文字ベクトルのどちらの場合でもテキストを末尾に付加します。

str = strcat("Hello","World")
str = "HelloWorld"

大かっこ、plus、または strcat のどれを使用する場合でも、任意の数の引数を指定できます。HelloWorld の間にスペース文字を追加します。

str = "Hello" + " " + "World"
str = "Hello World"

参考

| | | | | | | | | | | |

関連するトピック