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’.
--%.4f        4       
print(string.format("pi = %.4f",math.pi));
d = 5; m = 11; y = 1990;
--%02d0%2d      0print(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) end1    hello ""hello
2   
3