この初版はLua 5.0向けに書かれています。後続バージョンにも大部分は当てはまりますが、いくつかの違いがあります。
第4版はLua 5.3に対応しており、Amazonなどの書店で入手できます。
本書を購入することで、Lua プロジェクトの支援にもなります。
![]() |
Lua プログラミングLua | ![]() |
第III部 標準ライブラリ 第20章 文字列ライブラリ |
生のLuaインタプリタによる文字列操作能力は非常に限られています。プログラムは文字列リテラルを作成し、それらを連結できます。しかし、部分文字列を抽出したり、サイズを確認したり、内容を調べたりすることはできません。Luaで文字列を操作するための完全な能力は、その文字列ライブラリから得られます。
文字列ライブラリの一部の関数は非常にシンプルです。`string.len(s)` は文字列 `s` の長さを返します。`string.rep(s, n)` は文字列 `s` を `n` 回繰り返した文字列を返します。`string.rep("a", 2^20)` を使用して、1MBの文字列(例えばテスト用)を作成できます。`string.lower(s)` は大文字を小文字に変換した `s` のコピーを返し、文字列内の他の文字は変更されません(`string.upper` は大文字に変換します)。例として、大文字小文字を区別せずに文字列の配列をソートしたい場合、次のように記述できます。
table.sort(a, function (a, b) return string.lower(a) < string.lower(b) end)`string.upper` と `string.lower` はどちらも現在のロケールに従います。そのため、European Latin-1ロケールを使用している場合、以下の式
string.upper("ação")の結果は`AÇÃO`になります。
`string.sub(s,i,j)` は文字列 `s` の `i` 番目の文字から `j` 番目の文字まで(両端を含む)の部分文字列を抽出します。Luaでは、文字列の最初の文字のインデックスは1です。負のインデックスを使用することもでき、これは文字列の末尾からカウントします。インデックス `-1` は文字列の最後の文字を、`-2` はその前の文字を指し、以下同様です。したがって、`string.sub(s, 1, j)` は長さ `j` の文字列 `s` のプレフィックスを取得し、`string.sub(s, j, -1)` は `j` 番目の文字から始まる文字列のサフィックスを取得します(第3引数を指定しない場合、デフォルトで `-1` になるため、最後の呼び出しは `string.sub(s, j)` と書くことができます)。また、`string.sub(s, 2, -2)` は先頭と末尾の文字を除いた文字列 `s` のコピーを返します。
s = "[in brackets]" print(string.sub(s, 2, -2)) --> in brackets
Luaの文字列は不変であることを覚えておいてください。`string.sub` 関数は、Luaの他の関数と同様に、文字列の値を変更するのではなく、新しい文字列を返します。
string.sub(s, 2, -2)のような記述をして、`s` の値が変更されると仮定するのはよくある間違いです。変数の値を変更したい場合は、変数に新しい値を代入する必要があります。
s = string.sub(s, 2, -2)
`string.char` 関数と `string.byte` 関数は、文字とその内部数値表現の間で変換します。`string.char` 関数は0個以上の整数を受け取り、それぞれを文字に変換し、それらの文字を連結した文字列を返します。`string.byte(s, i)` 関数は文字列 `s` の `i` 番目の文字の内部数値表現を返します。第2引数は省略可能なので、`string.byte(s)` という呼び出しは `s` の最初の(または単一の)文字の内部数値表現を返します。次の例では、文字がASCIIで表現されていることを前提としています。
print(string.char(97)) --> a i = 99; print(string.char(i, i+1, i+2)) --> cde print(string.byte("abc")) --> 97 print(string.byte("abc", 2)) --> 98 print(string.byte("abc", -1)) --> 99最後の行では、負のインデックスを使用して文字列の最後の文字にアクセスしました。
`string.format` 関数は、文字列のフォーマット、特に出力を行う際に強力なツールです。これは、最初の引数であるいわゆるフォーマット文字列によって記述された説明に従って、可変個の引数のフォーマットされたバージョンを返します。フォーマット文字列は、標準Cの`printf`関数のものと同様のルールを持ちます。これは通常のテキストとディレクティブで構成され、各引数をフォーマットされた文字列のどこにどのように配置するべきかを制御します。単純なディレクティブは、`%`文字と、引数のフォーマット方法を指示する文字(10進数の`d`、16進数の`x`、8進数の`o`、浮動小数点数の`f`、文字列の`s`など、他のバリエーションを含む)です。`%`と文字の間には、浮動小数点数の小数点以下の桁数など、フォーマットの詳細を制御する他のオプションを含めることができます。
print(string.format("pi = %.4f", PI)) --> pi = 3.1416 d = 5; m = 11; y = 1990 print(string.format("%02d/%02d/%04d", d, m, y)) --> 05/11/1990 tag, title = "h1", "a title" print(string.format("<%s>%s</%s>", tag, title, tag)) --> <h1>a title</h1>最初の例では、`%.4f` は小数点以下4桁の浮動小数点数です。2番目の例では、`%02d` は少なくとも2桁でゼロ埋めされた10進数(`d`)を意味します。ゼロのない`%2d`ディレクティブは、パディングに空白を使用します。これらのディレクティブの完全な説明については、Luaリファレンスマニュアルを参照してください。あるいは、Luaはここで難しい作業を行うために標準Cライブラリを呼び出すため、Cのマニュアルを参照する方が良いでしょう。
Copyright © 2003–2004 Roberto Ierusalimschy. All rights reserved. | ![]() |