0Pricing
Lua Academy · レッスン

string.gsubとstring.gmatch

文字列内のパターンマッチを置換し、反復処理します。

「string.gsubとstring.gmatch」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

string.gsub の基本

string.gsub(s, pattern, repl, n)は、s内のpatternに一致する部分をreplで置換します。置換回数は最大n回で、デフォルトではすべて置換します。置換後の文字列と、実行した置換回数を返します。置換値には文字列、テーブル、関数を指定できます。

local s = "hello world hello"
local result, count = string.gsub(s, "hello", "hi")
print(result)  -- hi world hi
print(count)   -- 2

-- Limit replacements
local r2 = string.gsub(s, "hello", "hi", 1)
print(r2)      -- hi world hello

置換におけるキャプチャ参照

置換文字列内の%1、%2などは、パターン内のキャプチャを参照します。%0は一致した全体を参照します。これを使うと、一致したテキストの並べ替えやラップができます。

-- Swap first and last name
local name = "Smith, John"
local swapped = string.gsub(name, "(%a+), (%a+)", "%2 %1")
print(swapped)   -- John Smith

-- Wrap numbers in brackets
local text = "items: 3 and 7 total 10"
local tagged = string.gsub(text, "%d+", "[%0]")
print(tagged)    -- items: [3] and [7] total [10]

置換に使う関数

置換値が関数の場合、gsubは一致するたびに(キャプチャがあればキャプチャも)その関数に渡し、戻り値を置換値として使用します。nilまたはfalseを返すと、元の一致部分を維持します。これにより、動的に計算した置換を行えます。

local env = {NAME="Lua", VERSION="5.4"}
local template = "Welcome to $NAME version $VERSION!"
local result = string.gsub(template, "%$(%w+)", env)
print(result)   -- Welcome to Lua version 5.4!

-- Double each number
local s = "a1 b2 c3"
local r = string.gsub(s, "%d+", function(n)
  return tostring(tonumber(n) * 2)
end)
print(r)  -- a2 b4 c6

置換に使うテーブル

置換値がテーブルの場合、gsubは一致部分(または最初のキャプチャ)をキーとしてテーブルから検索し、結果を使用します。検索結果がnilまたはfalseの場合は、元の一致部分を維持します。置換辞書に最適です。

local abbreviations = {
  str = "string",
  num = "number",
  tbl = "table",
  fn  = "function",
}

local text = "A str can hold a num or a tbl"
local expanded = string.gsub(text, "%a+", abbreviations)
print(expanded)
-- A string can hold a number or a table

string.gmatch の基本

string.gmatch(s, pattern)は、s内でpatternに一致するすべての部分を反復するイテレータを返します。イテレータを呼び出すたびに、次の一致部分を返します(パターンにキャプチャがあればキャプチャを返します)。Luaで一致部分を反復処理する標準的な方法です。

local s = "one=1 two=2 three=3"

-- Iterate all words
for word in string.gmatch(s, "%a+") do
  io.write(word .. " ")
end
print()  -- one two three

-- Iterate key=value pairs
for k, v in string.gmatch(s, "(%a+)=(%d+)") do
  print(k, v)
end

gmatch によるトークン化

入力のトークン化にはstring.gmatchを使います。空白で分割したり、CSVの行を解析したり、構造化データを抽出したりできます。パターンでキャプチャする対象を定義し、それ以外はすべて区切り文字として扱います。

-- Split by whitespace
local function tokenize(s)
  local tokens = {}
  for token in string.gmatch(s, "%S+") do
    tokens[#tokens+1] = token
  end
  return tokens
end

local toks = tokenize("  hello   world   lua  ")
for i, t in ipairs(toks) do
  print(i, t)
end
-- 1 hello  2 world  3 lua

URLパラメータの解析

キーと値のペアを反復処理してクエリ文字列を解析します。パターン([^&=]+)=([^&]+)は、&を区切りとして、=で区切られた各キーと値をキャプチャします。

local url_params = "name=Alice&age=30&city=Istanbul"
local params = {}

for key, value in string.gmatch(url_params, "([^&=]+)=([^&]*)") do
  params[key] = value
end

print(params.name)  -- Alice
print(params.age)   -- 30
print(params.city)  -- Istanbul

HTMLタグの除去

よくあるテキスト処理の一つに、文字列からHTMLタグを削除する処理があります。開始タグと終了タグに一致するパターンを使ってstring.gsubを呼び出し、空文字列に置換します。

local html = "<h1>Hello</h1> <p>World <b>bold</b></p>"
local plain = string.gsub(html, "<[^>]+>", "")
print(plain)   -- Hello  World bold

-- Replace <br> with newline
local html2 = "line1<br>line2<br/>line3"
local fixed = string.gsub(html2, "<br/?>", "\n")
print(fixed)

マジック文字のエスケープ

Luaのパターンで使われるマジック文字は、. + * ? [ ] ^ $ % ( )です。これらをリテラルとして一致させるには、%でエスケープします。これらの文字を含む文字列をそのまま検索する場合は、string.findの第4引数にtrueを渡してパターンマッチングを無効にします。

-- Escape a string for use in a pattern
local function escapePattern(s)
  return (string.gsub(s, "[%(%)%.%%%+%-%*%?%[%^%$]", "%%%1"))
end

local query = "1+1=2"
local pattern = escapePattern(query)
print(string.find("result: 1+1=2", pattern, 1))  -- 9  13

出現回数を数える

string.gsubの2番目の戻り値(置換回数)を使うと、置換を行わずに文字列内のパターンの出現回数を数えられます。

local text = "banana"
local _, count = string.gsub(text, "a", "")
print("'a' appears " .. count .. " times")  -- 3

-- Count words
local sentence = "the quick brown fox"
local _, wordCount = string.gsub(sentence, "%S+", "")
print("Words:", wordCount)  -- 4

確認問題

string.gsub("hello", "l", "L")は何を返しますか。

まとめ:gsub と gmatch

まとめ:

  • gsub(s, pat, repl, n) — 置換します。replには文字列、テーブル、関数を指定できます
  • 置換文字列内の%1〜%nはキャプチャを参照します
  • gmatch(s, pat) — すべての一致部分を反復します
  • マジック文字をエスケープするには%を使います:%.、%+など
  • 出現回数はgsubの2番目の戻り値で数えます

よくある質問

「string.gsubとstring.gmatch」レッスンは無料ですか?

はい。「string.gsubとstring.gmatch」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「string.gsubとstring.gmatch」で何を学びますか?

文字列内のパターンマッチを置換し、反復処理します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「string.gsubとstring.gmatch」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 文字列の基礎:連結と長さ
  2. 部分文字列の検索と抽出
  3. 出力のためのstring.format
  4. string.gsubとstring.gmatch
← Lua Academyに戻る