Luaの文字列ライブラリのいくつかの操作

4541 ワード

Luaでは、プログラムは文字列の常亮、リンク文字列、および取得文字列の長さしか作成できません.しかし、これ以上はできません.つまり、サブストリングを抽出したり、文字列の内容を取得したりすることはできません.Luaでの本格的な文字列操作能力は文字列ライブラリ(String)から来ている.
1.基本文字列関数
s="hello lua"

string.len(s)     --        
string.rep(s)     --       n    
s:rep(n)          --       n    


例えばstringを用いることができる.rep(「a」,2^20)は、1 MBの文字列を作成します.
string.lower(s)   --     s   ,              ,    
string.upper(s)   --      

大文字と小文字の変換関数には、文字列配列をソートし、大文字と小文字を区別しない古典的な用途があります.
string.sub(s, i[,j])
string.sub(s,i,j) --      s    i   j   (         0)
Luaにおける文字列の最初の文字のインデックスは1である.負のインデックスを使用することもできます.これにより、文字列の末尾からカウントが開始され、インデックス-1は最後の文字を表し、-2は最後から2番目の文字を表します.
s:sub(1,j)
string.sub(s,1,j) --     s  j   
s:sub(j)          --        -1
string.sub(s,j,-1)--   s  j            

string.sub(s,2,-2)--  s              

Luaの文字列は可変ではないことを覚えておいてください.Luaの他のすべての関数と同じようにstring.subは文字列の値を変更せず、新しい文字列のみを返します.
関数string.义齿byteは、文字とその内部数値表現を変換するために使用されます.string.char関数は、0つ以上の整数を受け入れ、各整数を対応する文字に変換し、これらの文字がリンクされた文字列を返します.string.byte(s,i)は、文字列sのi番目の文字の内部数値表現を返し、その2番目のパラメータはオプションでstringを呼び出す.byte(s)は、文字列sの最初の文字の内部数値表現を返すことができる.
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

lua 5.1でstring.byteは、オプションの3番目のパラメータを受け入れることもできます.stringを呼び出すbyte(s,i,j)は、インデックスiからjの間(i,jを含む)のすべての文字の内部表現を返すことができる.(3番目のパラメータがない場合、デフォルトj=i)!!!この特性Luaはいろいろなところで使われています!!!
関数string.formatは文字列をフォーマットする利器であり,出力によく用いられる.最初のパラメータの説明に従って、後続の他のパラメータのフォーマットバージョンが返されます.この最初のパラメータは「フォーマット文字列」とも呼ばれます.フォーマット文字列を記述する規則はC言語のprintfなどの関数の規則と基本的に同じである:1つのインジケータ文字'%'に1つのアルファベット組成を加え、dは10進数、xは16進数、oは8進数、fは浮動小数点数、sは文字列などに用いる.パーセンテージとアルファベットの間で、フォーマットの詳細を制御するための他のオプションを指定できます.
print(string.string.format("pi=%.4f", math.pi))       -->pi=3.1416
d=5;m=11;y=1990
print(string.format("%02d/%02d/%04d",d,m,y))          -->05/11/1990
tag,title="hi","atitle"
print(string.format("%s%s>",tag,title,tag))     -->

atitle


1回目の印刷では、%.4 fは浮動小数点数の小数点以下4桁を表す.2回目の印刷では、%02 dは1つの10進数が少なくとも2つあることを示し、足りない場合は0で補うが、%2 dはスペースで補うことを示す.
2.パターンマッチング(pattern-matching)関数
文字列ライブラリで最も強力な関数はfind、match、gsub(global substitution、グローバル置換)、およびgmatch(global match、グローバルマッチング)であり、いずれもモードベースである.
2.1 string.find関数
string.find関数は、指定されたターゲット文字列内でモードを探すために使用されます.最も簡単な方法は、単語を返すことです.
s="hello world"
i,j=string.fill(s, "hello")
print(i,j)                              -->1    5
print(string.sub(s,i,j))                -->hello
print(string.find(s,"world"))           -->7    11
i,j=string.find(s,"l")
print(i,j)                              -->3   3

print(string.fill(s, "lll"))            -->nil  

string.find関数には、ターゲット文字列のどの位置から検索すべきかを示すインデックスであるオプションの3番目のパラメータもあります.このパラメータは、所与のモードに一致するすべての部分を処理する場合に役立ちます.新しい一致を繰り返し検索できます.検索のたびに、前回見つかった場所から開始します.
local t={}                       --     table
local i=0
while true do
	i=string.find(s,"
",i+1) -- if i=nil then break end t[#t+1]=i end

2.2 string.match関数
string.findとstring.matchはとても似ていて、違うところはstringです.matchは、モードが存在する位置ではなく、ターゲット文字列がモードに一致する分子列を返します.
print(string.match("hello world","hello"))             -->hello

2.3 string.gsub関数
string.gsubには、ターゲット文字列、モード、置換文字列の3つのパラメータがあります.基本的な使い方は、ターゲット文字列内のすべてのパターンが表示される場所を置換文字列(最後のパラメータ)に置き換えることです.
s=string.gsub("Lua is cute","cute","greate")
print(s)             -->Lua is greate
s=string.gsub("all lii","l","x")
print(s)             -->axx xii
s=string.gsub("Lua is great","Sol","Sun")
print(s)             -->Lua is great

--           ,         :

s=string.gsub("all lii","l","x",1)
print(s)              -->axl lii
s=string.gsub("all lii","l","x",2)
print(s)              -->axx lii

関数string.gsubにはもう一つの結果,すなわち実際の置換回数がある.たとえば、次のコードは、文字列内のスペースの数を統計する簡単な方法です.
cout=select(2,string.gsub(str," "," "))

2.4 string.gmatch関数
これは、すべてのターゲット文字列の仕様に合致する文字列を返します.「%a+」は、1つ以上のアルファベット文字列(単語)に一致することを示します.