English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
文字列または串(String)は数字、アルファベット、アンダースコアで構成される一連の文字です。
Lua言語では文字列を以下の3つの方法で表現できます:
の文字列。
の文字列。
[[ と ]] の文字列。
以下の3つの方法の文字列の例示は以下の通りです:
string1 = "Lua" print("\"文字列" 1 は\"",string1) string2 = 'oldtoolbag.com' print("文字列" 2 は",string"2) string3 = [["Lua 教程"]] print("文字列" 3 は",string"3)
以上のコードを実行した結果は:
文字列 1 は「Lua」 字符串 2 はoldtoolbag.com 字符串 3 は「Lua 教程」
エスケープシーケンスは直接表示できない文字を表すために使用されます、例えば、バックスペースキー、エンターキーなど。例えば、文字列内のダブルクォートは「"\""」で変換できます。
すべてのエスケープシーケンスと対応する意味:
エスケープシーケンス | 意味 | ASCIIコード値(10進数) |
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | アンダースコア文字'\'を表します | 092 |
\' | シングルクオート文字を表します | 039 |
\" | ダブルクオート文字を表します | 034 |
\0 | 空文字(NULL) | 000 |
\ddd | 1まで3位八進数が表す任意の文字 | 三位八進数 |
\xhh | 1まで2位十六進数が表す任意の文字 | 二位十六進数 |
Luaは文字列操作をサポートする多くの方法を提供しています:
序号 | 方法 & 用途 |
---|---|
1 | string.upper(argument): 文字列を全て大文字に変換します。 |
2 | string.lower(argument): 文字列を全て小文字に変換します。 |
3 | string.gsub(mainString,findString,replaceString,num) 文字列内で置き換えます。 mainStringは操作する文字列、findStringは置き換えられる文字、replaceStringは置き換えたい文字、numは置き換え次数(省略可能、全てを置き換えます)、例えば:> string.gsub("aaaa","a","z",3); zzza 3 |
4 | string.find (str, substr, [init, [end]]) 指定された目的文字列内で指定された内容を検索します(第3引数がインデックス)、その具体的位置を返します。存在しない場合はnilを返します。 > string.find("Hello Lua user", "Lua", 1) 7 9 |
5 | string.reverse(arg) 文字列を反転します > string.reverse("Lua") auL |
6 | string.format(...) printfに似た形式化文字列を返します > string.format("値は:%d",4) 値は:4 |
7 | string.char(arg) と string.byte(arg[,int]) charは整数値を文字に変換して結合します、byteは文字を整数値に変換します(指定できる文字がありますが、デフォルトは最初の文字です)。 > string.char(97,98,99,100) abcd > string.byte("ABCD",4) 68 > string.byte("ABCD") 65 > |
8 | string.len(arg) 文字列の長さを計算します。 string.len("abc") 3 |
9 | string.rep(string, n) 文字列stringのn個コピーを返します > string.rep("abcd",2) abcdabcd |
10 | .. 链接两个字符串 > print("www.w3codebox.".."com") ja.oldtoolbag.com |
11 | string.gmatch(str, pattern) 回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。 > for word in string.gmatch("Hello Lua user", "%a+") do print(word) end Hello Lua user |
12 | string.match(str, pattern, init) string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。 在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。 > = string.match("I have 2 questions for you.", "%d+ %a+") 2 questions > = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)")) 2, "questions" |
字符串截取使用 sub() 方法。
string.sub() 用于截取字符串,原型为:
string.sub(s, i [, j])
参数说明:
s:要截取的字符串。
i:截取开始位置。
j:截取结束位置,默认为 -1,最后一个字符。
-- 字符串 local sourcestr = "prefix--w3codeboxgoogletaobao--suffix" print("\n原始字符串", string.format("%q", sourcestr)) -- 截取部分,第1个到第15 local first_sub = string.sub(sourcestr, 4, 15) print("\n第一次截取", string.format("%q", first_sub)) -- 取字符串前缀,第1个到第8 local second_sub = string.sub(sourcestr, 1, 8) print("\n第二次切り出し", string.format("%q", second_sub)) -- 最後に切り出し10 local third_sub = string.sub(sourcestr, -10) print("\n第三次切り出し", string.format("%q", third_sub)) -- local fourth_sub = string.sub(sourcestr, -100) print("\n第四次切り出し", string.format("%q", fourth_sub))
以下のコードの実行結果は:
元の文字列 "prefix--w3codeboxgoogletaobao--suffix" 第一次切り出し "fix--w3codeboxg" 第二次切り出し "prefix--" 第三次切り出し "ao--suffix" 第四次切り出し "prefix--w3codeboxgoogletaobao--suffix"
以下の例は、文字列の大小写変換の方法を示しています
string1 = "Lua"; print(string.upper(string1)) print(string.lower(string1))
以下のコードの実行結果は:
LUA lua
以下の例は、文字列の検索と反転操作の方法を示しています
string = "Lua Tutorial" -- 文字列の検索 print(string.find(string,"Tutorial")) reversedString = string.reverse(string) print("新しい文字列は",reversedString)
以下のコードの実行結果は:
5 12 新しい文字列は lairotuT auL
Luaはstring.format()関数を提供して、特定のフォーマットを持つ文字列を生成します。関数の第1引数はフォーマットで、その後はフォーマット中の各コードに対応するデータです
フォーマット文字列があるため、生成された長い文字列の可読性が大幅に向上しました。この関数のフォーマットはC言語のprintf()に似ています
以下の例は、文字列のフォーマット化操作の方法を示しています
フォーマット文字列には以下のエスケープコードが含まれることがあります
%c - 数字を受け取り、ASCIIコード表中に対応する文字に変換します
%d, %i - 数字を受け取り、符号付き整数形式に変換します
%o - 数字を受け取り、8進数形式に変換します
%u - 指定された数字を無符号整数形式にフォーマットします
%x - 指定された数字を16進数形式にフォーマットし、小文字を使用します
%X - 指定された数字を16進数形式にフォーマットし、大文字を使用します
%e - 指定された数字を科学記数法形式にフォーマットし、小文字eを使用します
%E - 指定された数字を科学記数法形式にフォーマットし、大文字Eを使用します
%f - 指定された数字を浮動小数点数形式にフォーマットします
%g(%G) - %e(%E, %Gに対応)及び%fの短い形式のいずれかで数字をフォーマットします
指定された文字列をLuaコンパイラが安全に読み込める形式に変換します - %q
指定されたパラメータ形式に従って文字列をフォーマットします - %s
さらにフォーマットを詳細にするために、%号の後にパラメータを追加することができます。パラメータは以下の順序で読み取られます:
(1) 符号: 1+) 号は、その後の数字エスケープシンボルが正数を正号で表示するように指定します。デフォルトでは、負数のみが符号を表示します。
(2) 占位符: 0、後続で文字列の幅が指定されている場合の占位符です。指定しない場合のデフォルト占位符はスペースです。
(3) 並び方識別子: 文字列の幅が指定された場合、デフォルトで右寄せになります。増加-) 号は左寄せにすることができます。
(4) 幅の数値
(5) 小数桁数/文字列カット: 幅の数値の後ろに小数部分nが追加され、後続のf(浮動小数点数エスケープシンボル、例えば%)が指定されている場合、6.3f)は、浮動小数点数の小数部分をn桁に設定します。後続のs(文字列エスケープシンボル、例えば%)が指定されている場合、5.3s)は、その文字列が前のn桁のみを表示するように設定します。
string1 = "Lua" string2 = "Tutorial" number1 = 10 number2 = 20 -- 基本的文字列フォーマット化 print(string.format("基本的フォーマット %s %s",string1,string2)) -- 日付フォーマット date = 2; month = 1; year = 2014 print(string.format("日付フォーマット %02d/%02d/%03d", date, month, year)) -- 十進数フォーマット print(string.format("%.4f",1/3))
以下のコードの実行結果は:
基本的フォーマット Lua チュートリアル 日付フォーマット 02/01/2014 0.3333
他の例:
string.format("%c", 83) -- 出力S string.format("%",+d", 17.0) -- 出力+17 string.format("%05d", 17) -- 出力00017 string.format("%o", 17) -- 出力21 string.format("眻, 3.14) -- 出力3 string.format("%x", 13) -- 出力d string.format("%X", 13) -- 出力D string.format("%e", 1000) -- 出力1.000000e+03 string.format("%E", 1000) -- 出力1.000000E+03 string.format("%",6.3f", 13) -- 出力13.000 string.format("%q", "One\nTwo") -- 出力"One\ -- Two" string.format("%s", "monkey") -- 出力monkey string.format("%",10s", "monkey") -- 出力 monkey string.format("%",5.3s", "monkey") -- 出力 mon
以下の例では、文字と整数の相互変換を示しています:
-- 文字変換 -- 第1文字を変換 print(string.byte("Lua")) -- 第3文字を変換 print(string.byte("Lua",3)) -- 末尾の第1文字を変換 print(string.byte("Lua",-1)) -- 第2文字 print(string.byte("Lua",2)) -- 末尾の第2文字を変換 print(string.byte("Lua",-2)) -- 整数 ASCII コードを文字に変換 print(string.char(97))
以下のコードの実行結果は:
76 97 97 117 117 a
以下の例では、他の文字列操作、例えば文字列の長さの計算、文字列の結合、文字列の複写などが示されています:
string1 = "www." string2 = "w3codebox" string3 = ".com" -- を使用して文字列を結合 print("結合された文字列",string1..string2..string3) -- 文字列の長さ print("文字列の長さ ",string.len(string2)) -- 文字列複写 2 回 repeatedString = string.rep(string2,2) print(repeatedString)
以下のコードの実行結果は:
文字列を結合する ja.oldtoolbag.com 文字列の長さ 5 w3codeboxw3codebox
Luaでのマッチングパターンは、通常の文字列で直接記述されます。それは、パターンマッチング関数 string.find, string.gmatch, string.gsub, string.match。
パターン文字列内で文字クラスを使用することもできます。
文字クラスは、特定の文字集合内のどの文字でも一致するパターン項を指します。例えば、文字クラス %d 任意の数字に一致します。したがって、パターン文字列%d%dを使用できます。/%d%d/%d%d%d%d 検索 dd/mm/yyyy フォーマットの日付:
s = "Deadline is 30/05/1999, firm" date = "%d%d/%d%d/%d%d%d%d" print(string.sub(s, string.find(s, date))) --> 30/05/1999
以下の表はLuaがサポートするすべての文字クラスを示します:
単一の文字(除 ^$()%.[]*+-? 外): その文字自身とパートナーシップを結びます
.(点): どんな文字ともパートナーシップを結びます
%a: どんなアルファベットともパートナーシップを結びます
%c: どんな制御文字ともパートナーシップを結びます(例えば\n)
%d: どんな数字ともパートナーシップを結びます
%l: どんな小文字ともパートナーシップを結びます
%p: どんなピリオド文字ともパートナーシップを結びます
%s: どんなスペース文字ともパートナーシップを結びます
䱼な大文字ともパートナーシップを結びます
%w: どんなアルファベットともパートナーシップを結びます/数字とパートナーシップを結びます
%x: どんな16進数ともパートナーシップを結びます
%z: 0を表すどんな文字ともパートナーシップを結びます
%x(ここでxは非アルファベット非数字文字): 文字xとパートナーシップを結びます。主に表現式内の機能的な文字(^$()%.[])を処理するために使用されます。*+-?)のパートナーシップ問題、例えば%%と%とパートナーシップを結びます
[数个字符类]: 任意の[]に含まれる文字クラスとパートナーシップを結びます。例えば[%w_]は任何のアルファベットとパートナーシップを結びます:/数字、またはアンダースコア記号(_)とパートナーシップを結びます
[^数个字符类]: 任意の[]に含まれていない文字クラスとパートナーシップを結びます。例えば[^%s]は任何の非スペース文字とパートナーシップを結びます:
上記の文字クラスが大文字で書かれた場合、それらは非この文字クラスの任何の文字とパートナーシップを結ぶことを意味します。例えば、%Sは任何の非スペース文字とパートナーシップを結びます。例えば、'%A'は非アルファベットの文字とパートナーシップを結びます:
> print(string.gsub("hello, up-down!""%A",".")) hello..up.down. 4
数字4文字列の結果の一部ではなく、gsubが返す二つ目の結果であり、置換が発生した回数を表します。
パターンマッチングにはいくつかの特殊文字があります。彼らには特別な意味があります。Luaの特殊文字は以下の通りです:
( ) . % + - * ? [ ^ $
「%'」は特殊文字のエスケープ文字として用いられ、したがって「%.」はピリオドをマッチングします;「%%」は文字「%'」をマッチングします。エスケープ文字「%'」は特殊文字をエスケープするのに加えて、全ての非アルファベット文字に用いることができます。
パターンエントリは以下のようになります:
単一の文字クラスはそのクラス内の任意の単一文字をマッチングする;
単一の文字クラスに'?'をつける*「'」と そのクラスの文字を零か多くマッチングする。 このエントリは可能な限り長い文字列をマッチングする;
単一の文字クラスに'?'をつける+「'」と そのクラスの文字を一か多くマッチングする。 このエントリは可能な限り長い文字列をマッチングする;
単一の文字クラスに'?'をつける-「'」と そのクラスの文字を零か多くマッチングする。 「'」と*「'」と異なり、 このエントリは可能な限り短い文字列をマッチングする;
単一の文字クラスに'?'をつける そのクラスの文字を零か一つマッチングする。 可能な場合は、一つをマッチングする;
%n、 ここでは n 可能であれば 1 まで 9; このエントリは等しい n 記録された捕獲物(後で説明)の部分文字列。
%bxy、 ここでは というのは、この文字列を左から右に読み進めると、 および y は明確な2つの文字; は というのは、この文字列を左から右に読み進めると、 このエントリは y を開始 で終わる というのは、この文字列を左から右に読み進めると、 および y で、その中 を維持 平衡 の文字に読み込まれるたびにというのは、この文字列を左から右に読み進めると、 それとも、 +1 x y それとも、 -1、 最終的な終了地点のもの y は最初に0に達する y。 例えば、エントリ %b() は括弧がバランスの取れた表現をマッチします。
%f[set】、 指 境界パターン; このエントリは、 set 内の文字の前にある空文字列、 この位置の前の文字が属していない set 。 集合 set の意味は前面に述べました。 マッチした空文字列の開始および終了ポイントは、その場所に文字があると見なします。 「\0」と同じです。
パターン:
パターン パターンエントリのシーケンスを指します。 パターンの最前面にシンボル「^」を追加すると、文字列の開始位置からアンカーしてマッチングを行います。 パターンの最後にシンボル「$」を追加すると、マッチングプロセスが文字列の終わりにアンカーされます。 「^」および「$」が他の場所に現れる場合、それらは特別な意味を持たず、単に自分自身を表します。
キャプチャ:
パターンは内部で小括弧でサブパターンを括ることができます; これらのサブパターンは キャプチャ。 マッチが成功した場合、 キャプチャ マッチした文字列の部分文字列は、将来の用途のために保存されます。 キャプチャは左括弧の順序で番号付けされます。 例えば、モード「(a*文字列中に「a」*、 ))」にマッチする部分は*文字列中に「a」*「」の部分は (したがって、番号 1 ); 「.」にマッチする文字は 2 号キャプチャです。 「%s」にマッチする部分は*「」の部分は 3 号。
特例として、空のキャプチャ()は現在の文字列位置(数字)をキャプチャします。 例えば、モード「()aa()」を文字列「flaaap」に適用すると、2つのキャプチャが生成されます: 3 および 5 。