文字列 データタイプは、文字、数字、および符号のシーケンスです。ほとんどのテキストベースの情報を保存するデータタイプです。
ストリングを宣言
文字列変数を宣言するには、キャラクターの周りにクォートを置きます。ダブルクォート ( " ) を使用するのが一般的ですが、シングルクォート ( ' ) も機能します。文字列にシングルクォートまたはダブルクォートを含めたい場合は、他の種類のクォートで文字列を包んだり、脱出したクォート を使用したりします。
local string1 = "Hello world!"print(string1) --> 世界にこんにちは!local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
単語とダブルクォートの両方を文字列に含めるか、複数行の文字列を作成するには、ダブルブレットを使用して宣言します:
local string1 = [[Helloworld!Hello "world"!Hello 'world'!]]print(string1)--> ハロー--> ワールド!--> こんにちは「世界」!--> Hello 'world'!
必要に応じて、開始と終了の括弧の両方で同じ数の等号を使用して、複数の括弧を文字列内にネストできます:
local string1 = [=[Hello[[world!]]]=]print(string1)--> ハロー--> [[world!]]
文字列を結合する
文字列を結合するには、 2つのドットで結合 します(..)。文字列を結合すると、間にスペースが挿入されないので、以前の/以後の文字列の終わり/始まりにスペース(を)を含めるか、2つの文字列の間にスペースを結合する必要があります。
local hello = "Hello"local helloWithSpace = "Hello "local world = "world!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> ハローワールド!print(string2) --> 世界にこんにちは!print(string3) --> Hello world!
注: print() コマンドは複数の引数を受け入れ、 空間と結合して、 スペースを使用して、, の代わりに .. を使用して、print() 出力でスペースを生成できます。
local hello = "Hello"local world = "world"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> ハローワールド!print(hello, world .. exclamationMark) --> 世界にこんにちは!print(hello, world, exclamationMark) --> Hello world !
文字列を変換する
文字列を数に変換するには、 関数を使用します。文字列に数字表現がない場合は、 が返されます。
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Hello123"print(tonumber(alphanumericString)) --> nil
文字列を脱出する
ダブルクォートまたはシングルクォートの文字宣言から逃れ、ほぼどんな文字を埋め込むには、文字の前にバックスラッシュ ( \ ) を置きます。例えば:
- 単一のクォートを単一のクォート文字列に埋め込むには、\' を使用します。
- ダブルクォートをダブルクォート文字列に埋め込むには、\" を使用します。
local string1 = 'Hello \'world\'!'print(string1) --> こんにちは 'world'!local string2 = "Hello \"world\"!"print(string2) --> Hello "world"!
バックスラッシュの後に続く特定の文字は、脱出した文字ではなく、特別な文字を生成します:
- 新しい行を埋め込むには、\n を使用します。
- 横向きのタブを埋め込むには、\t を使用します。
local string1 = "Hello\nworld!"print(string1)--> ハロー--> ワールド!local string2 = "Hello\tworld!"print(string2) --> Hello world!
ストリングインターポレーション
Luau は 文字列のインターポレーション をサポートしており、文字列に式を挿入できる機能です。バッククォート ( ` ) を使用して、インターポレートされた文字列を宣言し、カーリーブレック内の式を追加します:
local world = "world"local string1 = `Hello {world}!`print(string1) --> Hello world!
変数は最も一般的な使用ですが、数学を含む任意の式を使用できます:
local world = "world"local number = 1local letters = {"w", "o", "r", "l", "d"}local string1 = `Hello {world}, {number} time!`local string2 = `Hello {world}, {number + 1} times!`local string3 = `Hello {table.concat(letters)} a third time!`print(string1) --> 世界にこんにちは、1回!print(string2) --> 世界にこんにちは、2回!print(string3) --> Hello world a third time!
標準の脱出規則は、バッククォート、カーリーブレックets、バックスラッシュに適用されます:
local string1 = `Hello \`\{world\}\`!`print(string1) --> Hello `{world}`!
数学変換
文字列に数学操作を実行すると、Luau は自動的に文字列を数字に変換します。文字列に数字表現がない場合、エラーが発生します。
print("55" + 10) --> 65print("55" - 10) --> 45print("55" * 10) --> 550print("55" / 10) --> 5.5print("55" % 10) --> 5print("Hello" + 10) --> print("Hello" + 10):1: attempt to perform arithmetic (add) on string and number
比較
文字列を比較するには、<、<=、>、および>=オペレーターを使用して、文字列内の各文字のASCIIコードに基づいてレキシカル順序で比較できます。これにより、文字列の数字が正しく比較されない結果が生じます。たとえば、"100" は、バイト "0" と "1" がバイト "2" よりも低い ASCII コードを持っているため、"20" より少なくなります。
print("Apple" < "apple") --> 真print("Banana" < "apple") --> true (B は ASCII の前にいる)print("number100" < "number20") --> true
文字列パターン参照
A 文字列パターン は、string.match()、string.gmatch()、その他の機能を使用して、長い文字列の一部またはサブ文字列を見つけるための文字の組み合わせです。
直接一致
Luau 関数の直接一致を使用できます string.match() , マジックカラーを除いて .たとえば、これらのコマンドは、文字列内で Roblox という単語を検索します:
local match1 = string.match("Welcome to Roblox!", "Roblox")local match2 = string.match("Welcome to my awesome game!", "Roblox")print(match1) --> Roblox(ロブロックス)lox のprint(match2) --> nil
キャラクタークラス
キャラクタークラスは、より高度な文字列検索に不可欠です。彼らを使用して、必ずしもキャラクター固有ではないが、既知のカテゴリ (クラス) 内に含まれるものを検索できます ( 文字 、 ディジット 、 スペース 、 記号 、など)。
次の表には、Luau 文字パターンの公式キャラクタークラスが示されています:
クラス | 代表する | 例の一致 |
---|---|---|
. | 任意のキャラクター | 32kasGJ1%fTlk?@94 |
%a | 大文字または小文字の文字 | abcdefghijklmnopqrsztuvwxyz |
%l | 小文字の文字 | abcdefghijklmnopqrstuvwxyz |
%u | 大文字の文字 | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
%d | 任意のディジット (数字) | 0123456789 |
%p | 任意のパンクチュエーション文字 | !@#;,. |
%w | アルファ数字のキャラクター (文字 または 数字) | abcdefghijklmnopqrsztuvwxyz0123456789 |
%s | スペースまたは白いスペース文字 | , \n , そして \r |
%c | 特別な コントロールキャラクター | |
%x | 十六進コードの文字 | 0123456789abcdef |
%z | NULL キャラクター ( \0 ) |
For single-letter character classes such as %a と %s のような単一の文字クラスの場合、対応する大文字はクラスの「反対」を表します。たとえば、%p は句読符のキャラクターを表し、%P は句読符を除いたすべてのキャラクターを表します。
魔法の文字
パターンで特別な目的に保留されている「魔法の文字」は 12 個あります:
$ | % | ^ | * | ( | ) |
. | [ | ] | + | - | ? |
% シンボルを使用して、魔法の文字を脱出して検索できます。たとえば、 roblox.com を検索するには、. (期間) 符号を前に % として、%. のように、期間を脱出します。
-- 「roblox.com」は「roblox#com」と一致しますが、期間は「任意の文字」として解釈されますlocal match1 = string.match("What is roblox#com?", "roblox.com")print(match1) --> roblox#com-- %で期間を脱出して、文字通りの期間文字として解釈されるようにするlocal match2 = string.match("I love roblox.com!", "roblox%.com")print(match2) --> roblox.com
アンカー
^ および $ 符号を使用して、ストリングの始まりや終わりでパターンを検索できます。
local start1 = string.match("first second third", "^first") -- 「最初」が最初にあるため、一致するprint(start1) --> 最初local start2 = string.match("third second first", "^first") -- 「最初」が最初にないので一致しませんprint(start2) --> ゼロlocal end1 = string.match("first second third", "third$") -- 「第三」が最終了にあるため、一致するprint(end1) --> 第3local end2 = string.match("third second first", "third$") -- 「第三」が最終了にないので一致しませんprint(end2) --> nil
両方の ^ と $ を一緒に使用して、パターンが全文字列のみに一致するように確認することもできます。
-- 全文字列でマッチするために ^ と $ の両方を使用するlocal match1 = string.match("Roblox", "^Roblox$") -- 「Roblox」が全文字列であるため、一致する (平等)print(match1) --> Roblox(ロブロックス)lox のlocal match2 = string.match("I play Roblox", "^Roblox$") -- 「Roblox」が始まりと終了わりにないため、一致しませんprint(match2) --> ゼロlocal match3 = string.match("I play Roblox", "Roblox") -- 「Roblox」が「I play Roblox」内に含まれているため、一致するprint(match3) --> Roblox
クラス修正子
キャラクタークラス自体は、文字列で 1 文字しか一致しません。たとえば、次のパターン("%d")は、左から右に文字列を読み始め、 最初の ディジットを見つけ(2)、停止します。
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match) --> 2
任意のキャラクタークラスで 修正子 を使用して結果を制御できます:
量化子 | 意味 |
---|---|
+ | 以前のキャラクタークラス 1つまたは複数を一致させる |
- | 前のキャラクタークラスの少数をできるだけ一致させる |
* | 以前のキャラクタークラス 0 以上を一致させる |
? | 前のキャラクタークラスの 1 または少なくともをマッチする |
%n | For n の間で 1 と 9 の間の、n のキャプチャされた文字列と同じサブストリングを一致させます。 |
%bxy | バランスの取れたキャプチャが x 、 y 、そしてその間のすべてを一致させる (たとえば、 %b() は括弧のペアとその間のすべてを一致させる) |
同じパターンに修正子を追加する ( "%d+" 代わりに "%d" )、結果を出力する 25 代わりに 2 :
local match1 = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match1) --> 2local match2 = string.match("The Cloud Kingdom has 25 power gems", "%d+")print(match2) --> 25
クラスセット
セット は、単一のキャラクタークラスが全体の作業を行うことができないときに使用する必要があります。たとえば、単一のパターンを使用して、小文字の letters ( ) と punctuation characters ( ) の両方を一致させたい場合があります。
セットは、ブラケット [] で定義されます。次の例では、セットを使用する( )と、セットを使用しない( )の違いに注意してください。
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- 設定print(match1) --> こんにちは!!!local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- 設定しないprint(match2) --> o!!!
最初のコマンド (セット) は、Luau に小文字の文字と区切り符を両方見つけるように指示します。全体セッ設定するの後に 量計算子を追加して、それらのすべてのキャラクター ( ) を見つけ、スペースに到達すると停止します。
2番目のコマンド (設定なし) では、+ 量計は前の %p クラスにのみ適用され、ルアウはピリオドの連続 (!!!) の前に最初の小文字字母 (o) のみを捕捉します。
キャラクタークラスと同様、セットは自分自身の「反対」であることができます。これは、セッ設定するの始めに ^ 文字を追加し、開始後すぐに [ を開くことで行われます。たとえば、 は句読点とスペースの両方を表し、 は句読点とスペースを除いたすべての文字を表します。
セットはまた、 範囲 をサポートしており、開始と終了の文字間のすべてのマッチを見つけることができます。これは、Lua 5.1 マニュアルで詳細に説明されている高度な機能です。
文字列キャプチャ
ストリング キャプチャ は、パターン内のサブパターンです。これらは括弧 () で囲まれており、一致するサブストリングを取得して変数に保存するのに使用されます。たとえば、次のパターンには、(%a+) と (%d+) の 2つのキャプチャが含まれており、成功した一致により2つのサブストリングが返されます。
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("TwentyOne = 21", pattern)print(key1, val1) --> トゥエンティワン21local key2, val2 = string.match("TwoThousand= 2000", pattern)print(key2, val2) --> 2000の2千local key3, val3 = string.match("OneMillion=1000000", pattern)print(key3, val3) --> OneMillion 1000000
前のパターンでは、両方の %s クラスに続く ? 量評価は、スペースを = 符号の両側にオプションにするため、安全な追加です。つまり、平等記号の周りに 1つまたは両方のスペースが欠落している場合、マッチが成功することを意味します。
ストリングキャプチャも、以下の例のように ネストされる ことができます:
local places = "The Cloud Kingdom is heavenly, The Forest Kingdom is peaceful"local pattern = "(The%s(%a+%sKingdom)[%w%s]+)"for description, kingdom in string.gmatch(places, pattern) doprint(description)print(kingdom)end--> クラウドキングダムは天国的--> クラウド王国--> 森の王国は平和です--> Forest Kingdom
このパターン検索は次のように機能します:
string.gmatch() Iterator は、外側の括弧のペアによって定義された「詳細明」パターン全体で一致を検索します。これは最初のコマで停止し、次のものをキャプチャします:
# | パターン | キャプチャ |
---|---|---|
1 | (The%s/%a+%sKingdom][%w%s]+) | クラウドキングダムは天国です |
成功した最初テキストキャプチャキャプチャを使用して、Iterator は次に内部の括弧のパターンで定義された "王国" パターンで一致を検索します。このネストパターンは単にフォロー中のものをキャプチャします:
# | パターン | キャプチャ |
---|---|---|
2 | (%a+%sキングダム) | クラウド王国 |
その後、イテレータは後退し、全文字列を検索し続け、フォロー中のものをキャプチャします:
# | パターン | キャプチャ |
---|---|---|
3 | (The%s/%a+%sKingdom][%w%s]+) | 森の王国は平和です |
4 | (%a+%sキングダム) | 森の王国 |
上記のすべてに加えて、 空のキャプチャ ( () )がある特別なケースがあります。キャプチャが空である場合、ストリングの位置がキャプチャされます:
local match1 = "Where does the capture happen? Who knows!"local match2 = "This string is longer than the first one. Where does the capture happen? Who knows?!"local pattern = "()Where does the capture happen%? Who knows!()"local start1, finish1 = string.match(match1, pattern)print(start1, finish1) --> 1 42local start2, finish2 = string.match(match2, pattern)print(start2, finish2) --> 43 84
これらの特別なキャプチャは、通常のものと同様にネストされる可能性があります:
local places = "The Cloud Kingdom is heavenly, The Forest Kingdom is peaceful."local pattern = "The (%a+()) Kingdom is %a+"for kingdom, position in string.gmatch(places, pattern) doprint(kingdom, position)end--> クラウド10--> Forest 42
返された値は、文字列ではなく 数字 であるため、珍しいです:
local match = "This is an example"local pattern = "This is an ()example"local position = string.match(match, pattern)print(typeof(position)) --> number