Luaの文字列操作 ①ある文字列から必要な部分を取り出す。しかも一気にまとめて取り出す方法。
Luaの文字列操作は非常に楽です。しかし、ただちょっとサンプルが少なくて、少し取っ付きにくいなと感じる方もいらっしゃるのではないでしょうか。だとすれば、それは残念なことです。ちょっと「名前,住所,電話番号」という文字列から、3つの要素を取り出すという例をやってみましょう。
Luaでは、こういったケースではstring.match()関数に適当な文字列パターンを与えるとで、名前、住所、電話番号が一気に取り出すことができます。強力ですよね?
それでは以下、Luaのstring.matchに与えるパターンを考えてみましょう。
■Step1.取り出す個数を考える。
取り出す要素は三つですね。そのそれぞれが()に相当するので、string.matchに対して与えるパターンは「()()()」でできることがわかります。
■Step2.区切りを表現をする。
今回の文字列は「,」で二箇所区切ってあります。区切り文字「,」は特別な文字なので、%,とかけます。パターンは「()%,()%,()」と書くことができます。
■Step3.取り出す要素を表現する。
最後に取り出したい要素がまだ()のままになっているので、()の中身をきちんとパターンで表現して、string.match()に与えるパターンを完成させましょう。住所や名前に特に文字に縛りはないため、任意の文字が繰り返されると考えます。任意の文字は「.」で、それが繰り返されるので「-」か「+」が続きます。「+」にすると出来るだけ最長でマッチさせようとし、「-」は最短にしようとします。名前や住所の要素を取り出すために(.+)としてしまうと行全体の範囲をマッチさせようとしてしまいます。名前と住所は次の「,」までで止めたいので(.-)とします。逆に電話番号は最短マッチをさせてしまうと1文字目だけで終了してしまうため、(.+)とし、最長マッチとしましょう。
パターンが出来ました。
(.-)%,(.-)%,(.+)
では実際に試して見ましょう。
> s="山田太郎,東京都新宿区,03-1111-1111" > name,addr,phone=string.match( s , "(.-)%,(.-)%,(.+)" ) > print( name ) 山田太郎 > print( addr ) 東京都新宿区 > print( phone ) 03-1111-1111
ほら。name,addr,phoneがstring.matchの一行で一気に取得できました。実に強力ですね!
電話番号はより正しく数字と-からなるなどのパターンの方が良いかもしれませんね。より優れたパターン使いになるため、下記のPatternsのところも読んでおきましょう。
http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html