サーチ…
構文
string.find(str、pattern [、init [、plain]]) - strの一致の開始と終了のインデックスを返します。
string.match(str、pattern [、index]) - 一度パターンにマッチします(インデックスから開始)
string.gmatch(str、pattern) - str内のすべての一致を反復処理する関数を返す
string.gsub(str、pattern、repl [、n]) - 部分文字列を置換します(最大n回まで)
.
すべての文字を表します。%a
はすべての文字を表します%l
はすべて小文字を表します%u
はすべて大文字を表します%d
はすべての数字を表します%x
はすべての16進数を表します%s
はすべての空白文字を表します%p
はすべての句読点文字を表します%g
はスペースを除くすべての印字可能な文字を表します%c
はすべての制御文字を表します[set]
は、set内のすべての文字の和集合であるクラスを表します。[^set]
は集合の補集合を表す*
貪欲な一致以前の文字クラスの0回以上の出現+
貪欲な一致前の文字クラスの1回以上の出現-
遅延マッチ前の文字クラスが0回以上出現する?
直前の文字クラスが0または1で一致する
備考
いくつかの例を通して、表記(<string literal>):function <string literal>
が使用されます。これは、 string.function(<string literal>, <string literal>)
と__index
です。 string
テーブルにstring
ます。
ルアパターンマッチング
正規表現を使用する代わりに、Lua文字列ライブラリには構文マッチで使用される特別な文字セットがあります。両方とも非常によく似ていますが、Luaパターンマッチングはより限定されており、構文が異なります。たとえば、文字シーケンス%a
任意の文字に一致し、大文字のバージョンはすべて非文字文字を表し、すべての文字クラス(パターンとして、一連の項目に一致することができる文字シーケンス)が以下にリストされています。
文字クラス | マッチングセクション |
---|---|
%a | 手紙(AZ、az) |
%c | 制御文字(\ n、\ t、\ r、...) |
%d | 数字(0〜9) |
%l | 小文字(az) |
%p | 句読記号(!、?、&、...) |
%s | スペース文字 |
%u | 大文字 |
%w | 英数字(AZ、az、0-9) |
%バツ | 16進数(\ 3、\ 4、...) |
%z | 表現0の文字 |
。 | 任意の文字に一致します。 |
上で述べたように、これらのクラスの大文字のバージョンはそのクラスの補集合を表します。たとえば、 %D
は任意の非数字文字シーケンスと一致します:
string.match("f123", "%D") --> f
文字クラスに加えて、一部の文字にはパターンとして特別な機能があります。
( ) % . + - * [ ? ^ $
文字%
は文字のエスケープを表し、 %?
尋問と一致し、 %%
はパーセント記号に一致します。 %
文字は他の英数字以外の文字と一緒に使うことができるので、引用符などのようにエスケープする必要がある場合は、その前に\\
使用する必要があります。これはルア文字列から任意の文字をエスケープします。
角括弧( []
)で囲まれた文字セットを使用すると、異なるクラスと単一文字を組み合わせて特殊文字クラスを作成できます。
local foo = "bar123bar2341"
print(foo:match "[arb]") --> b
文字セットの補集合は^
始めることができます。
local foo = "bar123bar2341"
print(string.match(foo, "[^bar]")) --> 1
この例では、 string.match
は、 b 、 aまたはrではない最初のオカレンスを検索します。
パターンは、繰り返し/任意の修飾子の助けを借りてより有用になります。パターンは以下の4つの文字を提供します:
キャラクター | モディファイア |
---|---|
+ | 1回以上の繰り返し |
* | 0回以上の繰り返し |
- | 0回以上繰り返し |
? | オプション(ゼロまたは1つのオカレンス) |
文字+
はシーケンス内の1つ以上の一致した文字を表し、常に最も長い時間一致したシーケンスを返します。
local foo = "12345678bar123"
print(foo:match "%d+") --> 12345678
見て分かるように、 *
は+
と似ていますが、文字の出現を受け付けず、通常、異なるパターン間のオプションのスペースを一致させるために使用されます。
文字は-
にも似ている*
が、代わりに最長マッチしたシーケンスを返す、それが最も短いものと一致します。
修飾子?
任意の文字にマッチします。たとえば、負の数字などをマッチさせることができます:
local foo = "-20"
print(foo:match "[+-]?%d+")
ルアパターンマッチングエンジンは、いくつかの追加のパターンマッチングアイテムを提供します:
キャラクターアイテム | 説明 |
---|---|
%n | nが1〜9の間で一致する場合、n番目のキャプチャされた文字列に等しい部分文字列 |
%bxy | 2つの異なる文字の間の部分文字列にマッチします( x とy バランスの取れたペア) |
%f[set] | フロンティア・パターン:空の文字列と一致し、次の文字 setに属し、前の文字がsetに属していない |
string.find(はじめに)
find
関数
最初にstring.find
関数を見てみましょう:
関数string.find (s, substr [, init [, plain]])
が見つかった場合、サブストリングの開始および終了インデックスを返し、そうでなければnil、インデックスから始まるinit
それは(1デフォルト)が設けられている場合。
("Hello, I am a string"):find "am" --> returns 10 11
-- equivalent to string.find("Hello, I am a string", "am") -- see remarks
パターンの導入
("hello world"):find ".- " -- will match characters until it finds a space
--> so it will return 1, 6
次の文字を除くすべては、自分自身を表す^$()%.[]*+-?)
。これらの文字のいずれかは、文字自体に続く%
で表すことができます。
("137'5 m47ch s0m3 d1g175"):find "m%d%d" -- will match an m followed by 2 digit
--> this will match m47 and return 7, 9
("stack overflow"):find "[abc]" -- will match an 'a', a 'b' or a 'c'
--> this will return 3 (the A in stAck)
("stack overflow"):find "[^stack ]"
-- will match all EXCEPT the letters s, t, a, c and k and the space character
--> this will match the o in overflow
("hello"):find "o%d?" --> matches o, returns 5, 5
("hello20"):find "o%d?" --> matches o2, returns 5, 6
-- the ? means the character is optional
("helllllo"):find "el+" --> will match elllll
("heo"):find "el+" --> won't match anything
("helllllo"):find "el*" --> will match elllll
("heo"):find "el*" --> will match e
("helelo"):find "h.+l" -- + will match as much as it gets
--> this matches "helel"
("helelo"):find "h.-l" -- - will match as few as it can
--> this wil only match "hel"
("hello"):match "o%d*"
--> like ?, this matches the "o", because %d is optional
("hello20"):match "o%d*"
--> unlike ?, it maches as many %d as it gets, "o20"
("hello"):match "o%d"
--> wouldn't find anything, because + looks for 1 or more characters
`gmatch`関数
使い方
string.gmatch
関数は入力文字列とパターンを取ります。このパターンは、実際に何を取り戻すかについて説明します。この関数は実際にはイテレータである関数を返します。このイテレーターの結果はパターンに一致します。
type(("abc"):gmatch ".") --> returns "function"
for char in ("abc"):gmatch "." do
print char -- this prints:
--> a
--> b
--> c
end
for match in ("#afdde6"):gmatch "%x%x" do
print("#" .. match) -- prints:
--> #af
--> #dd
--> #e6
end
キャプチャの紹介:
これは通常の関数と非常に似ていますが、完全一致の代わりにキャプチャのみを返します。
for key, value in ("foo = bar, bar=foo"):gmatch "(%w+)%s*=%s*(%w+)" do
print("key: " .. key .. ", value: " .. value)
--> key: foo, value: bar
--> key: bar, value: foo
end
gsub関数
部分文字列を返すstring.sub関数と混同しないでください!
使い方
文字列引数
("hello world"):gsub("o", "0")
--> returns "hell0 w0rld", 2
-- the 2 means that 2 substrings have been replaced (the 2 Os)
("hello world, how are you?"):gsub("[^%s]+", "word")
--> returns "word word, word word word?", 5
("hello world"):gsub("([^%s])([^%s]*)", "%2%1")
--> returns "elloh orldw", 2
関数の引数
local word = "[^%s]+"
function func(str)
if str:sub(1,1):lower()=="h" then
return str
else
return "no_h"
end
end
("hello world"):gsub(word, func)
--> returns "hello no_h", 2
テーブル引数
local word = "[^%s]+"
sub = {}
sub["hello"] = "g'day"
sub["world"] = "m8"
("hello world"):gsub(word, sub)
--> returns "g'day m8"
("hello world, how are you?"):gsub(word, sub)
--> returns "g'day m8, how are you?"
-- words that are not in the table are simply ignored