Luaのstringライブラリと強力なモードマッチング学習ノート
4821 ワード
lua原生解釈器の文字列の処理能力は非常に限られており、強力な文字列操作能力はstringライブラリから来ている.luaのstring関数はstring moduleにエクスポートされます.lua 5.1,stringタイプのメンバーメソッドとしても機能するのでstringと書くことができる.upper(s)、s:upper()で、好きな書き方を選ぶこともできます.
string.len(s)はsの長さを返します.string.rep(s,n)は、s文字列をn回繰り返す文字列を返す.string.lower(s)は、大文字を小文字に変換した文字列sのコピーlowerを返します.upperはローカル文字セットを使用します.また、string配列をソートしたい場合は、大文字と小文字を区別しない場合は、次のように書くことができます.
string.sub(s,i,j)はsから文字列を抽出し、iからj(閉区間[i,j])まで、もちろん負のインデックス値を使用して、文字列の末尾から計算することができます.-1は最後の文字で、-2は最後から2番目です.例:
luaの文字列は可変ではないことを覚えておいてください.
string.char, string.byteは、文字と対の数値の間の値を変換するために使用されます.例:
lua5.1 string.byteは、3番目のパラメータを受け入れ、i,j間の複数の値を返すことができる.たとえば、文字列を文字値配列に変換します.
文字列に再変換するには、次の手順に従います.
string.formatは強力な文字列フォーマット関数であり、c言語のprintfと同様であり、ここでは説明しない.
lua stringライブラリで最も強力な関数は、find、match、gsub、gmatchのモードマッチング関数です.他のスクリプト言語とは異なり、luaにはPOSIXの正規表現もperlの正規表現もありません.これらの実装によりluaはより多くのメモリを消費し、luaの初心はコンパクトでアプリケーションに埋め込まれた言語であるためである.luaは500行未満のコードで独自のモードマッチングを実現し、標準的な正規表現ほど強くない(一般的に4000以上のコードが必要)が、十分強い.
string.findは、指定した文字列にターゲットテンプレートが表示される場所を検索し、戻り開始位置と終了位置を検索しますが、戻りnilは見つかりません.例:
もちろん、string.findはまた、最初の検索位置を指定することもできます.このパラメータは、改行記号が表示される場所を知りたいなど、すべての出現位置を見つけたい場合に役立ちます.
string.matchとstring.findは同様に、指定したstringで対応するモードを検索します.違うのは、彼が戻ってきたのは見つけたstringです.
「hello」のような固定モードでは、この関数は意味がありません.しかし、可変モードでは、彼の強力な威力を示しています.
string.gsubには、3つのパラメータ、所与の文字列、マッチングモード、および代替文字列があります.役割は、一致モードに一致するすべての場所を代替文字列に置き換えることです.置換後の文字列と置換回数を返します.
string.gmatch関数は、所与の文字列に表示されるすべての一致する文字列を反復する反復器を返します.
モード:
文字クラス:(character classes)
彼らの大文字バージョンは彼自身の補完である.
魔法文字:
%で転義する.'%'を表す
文字セット(char-set):文字セットを使用して文字クラスをカスタマイズします.
1.異なる文字クラスと単一文字の間に[%w_]アルファベット文字とアンダースコアを一致させます.[01]マッチングバイナリ2.文字セット内に文字区間を含めるには、開始と終了の間に-[0-9]を加えると%d[0-9 a-fA-F]が%x 3に相当する.この文字セットの補完を求めたい場合は、^[^0-7]の非8進数を加算します.
繰り返しまたは選択可能なアクセサリー
キャプチャ
キャプチャメカニズムにより、モード列の一部がターゲット列種の一部と一致することができる.書き方は、パターン列でキャプチャする必要がある部分を()で囲みます.たとえば、次のようにします.
また、パターン列自体にキャプチャを使用することもできます.「(["'])(.-)%1」、ここで%1は、最初のキャプチャのコピーと一致することを示します.
置換
知ってるよstringgsubのパラメータはstringであってもよいが、実際には関数であってもよいし、tableであってもよい.関数であれば、取得した内容をパラメータとして呼び出し、返された内容を置換文字列とする.tableであれば、取得した内容をkeyとしてtableの値を取って置換文字列とし、存在しなければ置換しない.次のようになります.
(完)
string.len(s)はsの長さを返します.string.rep(s,n)は、s文字列をn回繰り返す文字列を返す.string.lower(s)は、大文字を小文字に変換した文字列sのコピーlowerを返します.upperはローカル文字セットを使用します.また、string配列をソートしたい場合は、大文字と小文字を区別しない場合は、次のように書くことができます.
table.sort(a, function(a, b)
return string.lower(a) < string.lower(b)
end)
string.sub(s,i,j)はsから文字列を抽出し、iからj(閉区間[i,j])まで、もちろん負のインデックス値を使用して、文字列の末尾から計算することができます.-1は最後の文字で、-2は最後から2番目です.例:
s = "[hello,world]"
print(string.sub(s, 2, -2)) --> hello,world
luaの文字列は可変ではないことを覚えておいてください.
string.char, string.byteは、文字と対の数値の間の値を変換するために使用されます.例:
i = 97
print(string.char(i, i+1, i+2)) --> abc
print(string.byte("abc")) --> 97
print(string.byte("abc"), -2) --> 98
lua5.1 string.byteは、3番目のパラメータを受け入れ、i,j間の複数の値を返すことができる.たとえば、文字列を文字値配列に変換します.
t = {s.byte(1, -1}
文字列に再変換するには、次の手順に従います.
string.char(unpack(t))
string.formatは強力な文字列フォーマット関数であり、c言語のprintfと同様であり、ここでは説明しない.
lua stringライブラリで最も強力な関数は、find、match、gsub、gmatchのモードマッチング関数です.他のスクリプト言語とは異なり、luaにはPOSIXの正規表現もperlの正規表現もありません.これらの実装によりluaはより多くのメモリを消費し、luaの初心はコンパクトでアプリケーションに埋め込まれた言語であるためである.luaは500行未満のコードで独自のモードマッチングを実現し、標準的な正規表現ほど強くない(一般的に4000以上のコードが必要)が、十分強い.
string.findは、指定した文字列にターゲットテンプレートが表示される場所を検索し、戻り開始位置と終了位置を検索しますが、戻りnilは見つかりません.例:
s = "hello,world"
i, j = string.find(s, "hello")
print(string.sub(s, i, j))
もちろん、string.findはまた、最初の検索位置を指定することもできます.このパラメータは、改行記号が表示される場所を知りたいなど、すべての出現位置を見つけたい場合に役立ちます.
local t = {}
local i = 0
while true do
i = string.find(s, "
", i+1)
if i == nil then break end
t[#t+1] = i
end
string.matchとstring.findは同様に、指定したstringで対応するモードを検索します.違うのは、彼が戻ってきたのは見つけたstringです.
print(string.match("hello,world","hello")) --> hello
「hello」のような固定モードでは、この関数は意味がありません.しかし、可変モードでは、彼の強力な威力を示しています.
date = "now is 2014/10/6 17:58"
d = string.match(date, "%d+/%d+/%d+")
print(d) --> 2014/10/6
string.gsubには、3つのパラメータ、所与の文字列、マッチングモード、および代替文字列があります.役割は、一致モードに一致するすべての場所を代替文字列に置き換えることです.置換後の文字列と置換回数を返します.
s = string.gsub("Lua is cute", "cute", "great")
print(s) --> Lua is great
string.gmatch関数は、所与の文字列に表示されるすべての一致する文字列を反復する反復器を返します.
モード:
文字クラス:(character classes)
. all characters
%a letters
%c control characters
%d digits
%l lower -case letters
%p punctuation characters
%s space characters
%u upper-case letters
%w alphanumeric characters
%x hexadecimal digits
%z the character whose representation is 0
彼らの大文字バージョンは彼自身の補完である.
魔法文字:
( ) . % + - * ? [ ] ^ $
%で転義する.'%'を表す
文字セット(char-set):文字セットを使用して文字クラスをカスタマイズします.
1.異なる文字クラスと単一文字の間に[%w_]アルファベット文字とアンダースコアを一致させます.[01]マッチングバイナリ2.文字セット内に文字区間を含めるには、開始と終了の間に-[0-9]を加えると%d[0-9 a-fA-F]が%x 3に相当する.この文字セットの補完を求めたい場合は、^[^0-7]の非8進数を加算します.
繰り返しまたは選択可能なアクセサリー
+ 1 or more repetitions, ,
* 0 or more repetitions
- also 0 or more repetitions
? optional (0 or 1 occurrence)
キャプチャ
キャプチャメカニズムにより、モード列の一部がターゲット列種の一部と一致することができる.書き方は、パターン列でキャプチャする必要がある部分を()で囲みます.たとえば、次のようにします.
pair = "name = anna"
key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
print(key, value) --> name anna
また、パターン列自体にキャプチャを使用することもできます.「(["'])(.-)%1」、ここで%1は、最初のキャプチャのコピーと一致することを示します.
置換
知ってるよstringgsubのパラメータはstringであってもよいが、実際には関数であってもよいし、tableであってもよい.関数であれば、取得した内容をパラメータとして呼び出し、返された内容を置換文字列とする.tableであれば、取得した内容をkeyとしてtableの値を取って置換文字列とし、存在しなければ置換しない.次のようになります.
function expand(s)
return string.gsub(s, "$(%w+)", _G)
end
name = "Lua"; status = "great"
print(expand("$name is $status, isn't it?"))
(完)