MATLAB ユーザーコミュニティー

MATLAB & Simulink ユーザーコミュニティー向け日本語ブログ

string型を使いこなそう – Loren’sブログから

こんにちは、道家です。在宅勤務を始めて2週間目に入りました。早く状況が治まることを願っています。 さて、今日は MathWorks ブログの中で2番目に歴史の長い Loren on the Art of MATLAB(一番歴史が長いのはどれでしょう?)からのトピックを紹介します。それがちょっと地味な string 型。 stringはR2016bに 新しく導入された型であり、従来の charに比べてテキストデータの扱いが容易になりました。 2月19日の String Things の投稿では、Loren はテキストデータの比較について書いています。 char 型、 もしくは文字列の配列で良く使われる cell 配列の比較に使われるのが strcmpstrcmpistrncmpstrncmpiです。

Contents

char 配列と cell 配列

cellChars = {'Book','Bookend','Weekend','weekday'}
cellChars =
  1×4 の cell 配列
    {'Book'}    {'Bookend'}    {'Weekend'}    {'weekday'}
特定の文字列を比較するには strcmp を使います。
TF = strcmp('Book',cellChars)
TF =
  1×4 の logical 配列
   1   0   0   0
先頭の文字を比較するには strncmp を使います。
TF = strncmp('Book',cellChars,4)
TF =
  1×4 の logical 配列
   1   1   0   0
大文字、小文字を区別しない場合は strcmpistrncmpi を使います。
TF = strncmpi('week',cellChars,4)
TF =
  1×4 の logical 配列
   0   0   1   1

string 配列

上記の例でも分かりますように、 char 配列はシングルクォーテーション( ' )を使って定義します。それと違って、 string 型はダブルクォーテーション( " )を使って定義します。しかも、それぞれの “単語” が一つの要素としてとらえられるので、普通に [] を使って配列を作成できます。
stringArray = ["Book","Bookend","Weekend","weekday"]
stringArray = 
  1×4 の string 配列
    "Book"    "Bookend"    "Weekend"    "weekday"
string でも char と同様 str* 関数を使うことできます。
TF = strcmp(stringArray,"Book")
TF =
  1×4 の logical 配列
   1   0   0   0
それに加えて比較演算子も使えるようになります。
TF = stringArray ~= "Weekend"
TF =
  1×4 の logical 配列
   1   1   0   1
更に、テキスト解析っぽい関数(個人の見解)も加わりました。例えば、完全一致には
TF = matches(stringArray,"Weekend")
TF =
  1×4 の logical 配列
   0   0   1   0
特定の文字の並びが存在するかを確認するには contains を使います。
TF = contains(stringArray,"end")
TF =
  1×4 の logical 配列
   0   1   1   0
他にも色々便利な関数が R2016b のタイミングで導入されました。是非確認してみてください。私のお気に入りは正規表現のライト版として extractAfterextractBeforeextractBetweenなどです。
methods string
クラス string に対するメソッド:

append          eraseBetween    join            replaceBetween  
cellstr         extractAfter    le              reverse         
char            extractBefore   lower           sort            
compose         extractBetween  lt              split           
contains        ge              matches         splitlines      
count           gt              ne              startsWith      
double          insertAfter     or              strip           
endsWith        insertBefore    pad             strlength       
eq              ismissing       plus            upper           
erase           issorted        replace         

ブログで良く取り上げられる string

実は Loren のブログでは結構 string 型の話が取り上げられています: Strings カテゴリー その中でも私のお勧めは string 型が導入された時の 紹介ブログです。あらゆる使い方について書いてあります。また、MathWorks ブログ全体で見ても string はかなり 取り上げられています。

とっておきの string 機能

私のとっておきの string 機能は string 型と数値の 連結です。MATLAB Answers などでよく聞く質問ですが、連番のファイル名を作成したい、という方いませんか。例えば、 file1, file2, file3, file4, file5 というファイル名を作成したいとしましょう。まず、 char 配列だと
for id = 1:5
    names1{id} = ['file' num2str(id)];
end
names1
names1 =
  1×5 の cell 配列
    {'file1'}    {'file2'}    {'file3'}    {'file4'}    {'file5'}
arrayfun を使って無理やりループを無くすみたいなこともできます。ただ、これだと何やってんのかさっぱり分かりませんね。
names2 = arrayfun(@(x) ['file' num2str(x)],1:5,'UniformOutput',false)
names2 =
  1×5 の cell 配列
    {'file1'}    {'file2'}    {'file3'}    {'file4'}    {'file5'}
これを string を使うとこんなにすっきりになります!
names3 = "file" + (1:5)
names3 = 
  1×5 の string 配列
    "file1"    "file2"    "file3"    "file4"    "file5"
解説: + 演算子が double 型を string 型に変換し、”file” を 1×5 の配列に拡張し連結してくれる。 こうなると、こんな面白い使い方も。
prefix = ["abc"; "def"; "xyz"]
names = prefix + (1:5)
prefix = 
  3×1 の string 配列
    "abc"
    "def"
    "xyz"
names = 
  3×5 の string 配列
    "abc1"    "abc2"    "abc3"    "abc4"    "abc5"
    "def1"    "def2"    "def3"    "def4"    "def5"
    "xyz1"    "xyz2"    "xyz3"    "xyz4"    "xyz5"

おわりに

以上、Loren on the Art of MATLAB ブログからの紹介でした。この様に定期的に他の MathWorks ブログに投稿されたネタを紹介し直すこともやっていきたいので、もし興味あるブログの記事がありましたらぜひコメントを残してください。

Published with MATLAB® R2019b

|

Comments

To leave a comment, please click here to sign in to your MathWorks Account or create a new one.