lua流水勘定5:string
22807 ワード
string.len(s):文字列sの長さを返します.string.rep(s,n):n回繰り返される文字列sの列stringを返す.lower(s):sの大文字を小文字stringに変換します.upper(s):sの小文字を大文字stringに変換します.sub(s,i,j):文字列sのi番目の文字からj番目の文字までの列を切り取る.Luaでは、文字列の最初の文字インデックスが1から始まります.負のインデックスの場合、負のインデックスは文字列の最後から前にカウントされます.-1は最後の文字を指し、-2は最後から2番目を指します.3番目のパラメータが指定されていない場合は、デフォルトは-1です.string.char:0個以上の整数を取得し、各数値を文字に変換し、これらの文字が接続されているすべての文字列を返します.string.byte(s,i):文字列sのi番目の文字を整数に変換し、2番目のパラメータはオプションで、デフォルトではi=1である.string.format:最初のパラメータはフォーマット列です.インジケータと制御フォーマットの文字からなります.インジケータ後の制御フォーマットの文字は、10進数’d’であってもよい.16進法’x’;8進法‘o’;浮動小数点数’f’;文字列’s’.
string.find:文字列検索、指定したパターンに一致する列をターゲット列内で検索します.関数は、一致する列が見つかったらnilを返します.
string.gsub:グローバル文字列置換、ターゲット列、モード列、置換列の3つのパラメータがあります.4番目のパラメータはオプションで、置換の範囲を制限します.1番目の戻り値は文字列で、2番目の戻り値は置換操作の回数を表します.彼の基本的な役割は、マッチングモードの列を検索し、置換列を使用して置換することです.
string.gfind:グローバル文字列検索
文字列モード:文字クラス:特定の文字セット内の任意の文字のモード項目を一致させることができます.任意の文字、%a:文字、%c:制御文字、%d:数字、%l:小文字、%p:句読点文字、%s:空白文字、%u:大文字、%w:文字と数字、%x:16進数、%zは0の文字Luaの特殊文字:().%+-*?[^$,そのうち%はエスケープ文字(はLuaのエスケープ文字). - :最初の文字と最後の文字の接続に使用します.この2つの文字の間の範囲内の文字のセットを表します.^:補完+を表します.前の文字に1回または複数回一致し、常に最長一致*:前の文字に0回または複数回一致し、常に最長一致-:前の文字に0回または複数回一致し、常に最短一致しますか?前の文字を0回または1回一致させ、
^:^で始まるモードはターゲット列の開始部分のみに一致します:終了モードはターゲット列の終了部分のみに一致します%b:対称文字に一致します
キャプチャ(Captures):パターン列の一部を使用して、ターゲット列の一部と一致させることができます.キャプチャしたいモードをカッコで囲むと、captureが指定されます.
%+num:前の()を表すために使用されます.
--%.4f 4
print(string.format("pi = %.4f",math.pi));
d = 5; m = 11; y = 1990;
--%02d , 0。%2d 0,
print(string.format("%02d/%02d/%04d",d,m,y))
tag,title = "h1","a title"
print(string.format("<%s>%s%s>",tag,title,tag))
:pi = 3.1416
05/11/1990
a title</h1>
string.find:文字列検索、指定したパターンに一致する列をターゲット列内で検索します.関数は、一致する列が見つかったらnilを返します.
s = "hello world"
i,j = string.find(s,"hello");
print(i,j);
--string.sub
print(string.sub(s,i,j));
print(string.find(s,"world"));
i,j = string.find(s,"l");
print(i,j);
print(string.find(s,"lll"));
:
1 5
hello
7 11
3 3
nil
local s = "string.find :
。
。
";
local t = {};
local i = 0;
while true do
i = string.find(s,"
",i+1);
if i == nil then break end;
table.insert(t,i);
end
for k,v in pairs(t) do
print("this is table k,v "..k..":"..v);
end
:this is table k,v 1:45
this is table k,v 2:85
this is table k,v 3:143
string.gsub:グローバル文字列置換、ターゲット列、モード列、置換列の3つのパラメータがあります.4番目のパラメータはオプションで、置換の範囲を制限します.1番目の戻り値は文字列で、2番目の戻り値は置換操作の回数を表します.彼の基本的な役割は、マッチングモードの列を検索し、置換列を使用して置換することです.
s = string.gsub("Lua is cute","cute","great");
print(s);
s = string.gsub("all lii","l","x");
print(s);
s = string.gsub("Lua is great","perl","tcl");
print(s);
s = string.gsub("all lii","l","x",1)
print(s);
s = string.gsub("all lii","l","x",2);
print(s);
_,count = string.gsub("Lua is cute"," "," ");
print(count);
:Lua is great
axx xii
Lua is great
axl lii
axx lii
2
string.gfind:グローバル文字列検索
文字列モード:文字クラス:特定の文字セット内の任意の文字のモード項目を一致させることができます.任意の文字、%a:文字、%c:制御文字、%d:数字、%l:小文字、%p:句読点文字、%s:空白文字、%u:大文字、%w:文字と数字、%x:16進数、%zは0の文字Luaの特殊文字:().%+-*?[^$,そのうち%はエスケープ文字(はLuaのエスケープ文字). - :最初の文字と最後の文字の接続に使用します.この2つの文字の間の範囲内の文字のセットを表します.^:補完+を表します.前の文字に1回または複数回一致し、常に最長一致*:前の文字に0回または複数回一致し、常に最長一致-:前の文字に0回または複数回一致し、常に最短一致しますか?前の文字を0回または1回一致させ、
^:^で始まるモードはターゲット列の開始部分のみに一致します:終了モードはターゲット列の終了部分のみに一致します%b:対称文字に一致します
--%A: ( ( ))
print(string.gsub("hello,up-down!","%A","."));
-- 3
:hello.up.down. 3
test1 = "int x; /* x */ int y; /* y */"
print(string.gsub(test1,"/%*.*%*/","" ));
test2 = "int x;/* x */ int y; /* y */"
print(string.gsub(test2,"/%*.-%*/","" ))
:int x; 1
int x; int y; 2
--%b:
print(string.gsub("a (enclosed (in) parentheses) line", "%b()",""));
:a line 1
キャプチャ(Captures):パターン列の一部を使用して、ターゲット列の一部と一致させることができます.キャプチャしたいモードをカッコで囲むと、captureが指定されます.
pair = "name = Anna";
-- ,
index1,index2,key,value = string.find(pair,"(%a+)%s*=%s*(%a+)");
print(index1,index2,key,value)
:1 11 name Anna
date = "17/7/1990";
index1,index2,d,m,y = string.find(date,"(%d+)/(%d+)/(%d+)");
print(index1,index2,d,m,y);
:1 9 17 7 1990
%+num:前の()を表すために使用されます.
s = [[then he said : "it's all right"!]]
-- %1
a,b,c,quotedPart = string.find(s, [[(["'])(.-)%1]]);
print(quotedPart)
print(c);
:it's all right
"
print(string.gsub("hello Lua!","(%a)","%1-%1"))
print(string.gsub("hello Lua","(.)(.)","%2%1"));
:h-he-el-ll-lo-o L-Lu-ua-a! 8
ehll ouLa 4
s = string.gsub("the \quote{task} is to \em{change} that","\(%a+){(.-)}","%2%1>");
print(s);
:the <quote>taskquote> is to change that
--
function trim(s)
return (string.gsub(s,"^%s*(.-)%s*$","%1"));
end
function expand(s)
s = string.gsub(s, "$(%w+)",function(n)
return _G[n];
end);
return s;
end
name = "Lua"; status = "great";
print(expand("$name is $status, isn't it?"));
:Lua is great, isn't it?
s = "sin(3) = $[math.sin(3)]; 2^5 = $[2^5]";
--%b
print((string.gsub(s, "$(%b[])",function(x)
x = "return "..string.sub(x,2,-2);
local f = loadstring(x);
return f();
end)))
:sin(3) = 0.14112000805987; 2^5 = 32
words = {};
for w in string.gfind("hello hi,again","(%a)") do
table.insert(words,w)
end
:hello
hi
again
--URL
--URL
function unescape(s)
s = string.gsub(s,"+", " ")
s = string.gsub(s,"%%(%x%x)",function(h)
return string.char(tonumber(h,16))
end)
return s;
end
print(unescape("a%2Bb+%3D+c"));
cgi = {};
function decode(s)
for name,value in string.gfind(s,"([^&=]+)=([^&=]+)") do
name = unescape(name);
value = unescape(value);
cgi[name] = value;
end
end
function escape(s)
s = string.gsub(s,"([&=+%c])",function(c)
return string.format("%%%02X",string.byte(c))
end)
s = string.gsub(s, " ","+");
return s;
end
function encode(t)
local s = "";
for k,v in pairs(t) do
s = s.."&"..escape(k).."="..escape(v);
end
return string.sub(s,2);
end
t = {name = "a1",query = "a+b = c",q = "yes or no"};
print(encode(t));
:a+b = c
q=yes+or+no&name=a1&query=a%2Bb+%3D+c
--CSV
function toCSV(t)
local s = "";
for _,p in pairs(t) do
s = s..","..escapeCSV(p);
end
return string.sub(s,2);
end
function escapeCSV(s)
if string.find(s, '[,"]') then
s = '"'..string.gsub(s,'"','""')..'"';
end
return s;
end
function fromCSV(s)
s = s .. ',';
local t = {};
local fieldstart = 1;
repeat
if string.find(s,'^"',fieldstart) then
local a,c;
local i = fieldstart;
repeat
a,i,c = string.find(s,'"("?)',i+1);
until c ~= '"'
if not i then error('unmatched "') end
local f = string.sub(s,fieldstart+1,i-1);
table.insert(t,(string.gsub(f,'"','"')));
fieldstart = string.find(s,',',i) + 1;
else
local nexti = string.find(s,',',fieldstart);
table.insert(t,string.sub(s,fieldstart,nexti - 1));
fieldstart = nexti + 1;
end
until fieldstart > string.len(s);
return t;
end
t = fromCSV('"hello ""hello","",""');
for i,s in ipairs(t) do print(i,s) end
:1 hello ""hello
2
3