Luaライブラリ 要注意点 ~正規表現ライブラリライブラリ~

パターン

パターンは、string.match関数などで文字列を検索するために使用されるものです。
パターンは、特別な意味を持つ特殊文字と、それ以外の通常文字から構成されます。
通常文字は、それ自身に合致します。
たとえば、aは、a自身に合致します。
特殊文字を含まないパターンは、その文字列そのままが対象文字列中から検索されます。~
パターンで使用する特殊文字は以下のとおりです。

キャプチャ(後方参照等)

パターンは、カッコで囲まれたサブパターンを含むことができ、これをキャプチャと呼びます。
パターンが合致したときには、キャプチャに相当する部分文字列は保存され、後で使用することができるようになります。
キャプチャの順序は開きカッコの出現順です。

たとえば、パターン"(a*(.)%w(%s*))"において、最初のキャプチャはa*(.)%w(%s*)に相当する部分文字列であり、
2番目のキャプチャは.に、3番目のキャプチャは%s*に相当する部分文字列となります。

Luaパターンの特殊なケースとして、空っぽのキャプチャ()は、その場所の文字列の中での位置をキャプチャします
たとえば、パターン"()aa()"を文字列"flaaap"に適用した場合、3と5がキャプチャされます。この空っぽのキャプチャは正規表現では使えません。

string.find(str, pattern, init, plain)

str文字列型文字列strの先頭から、パターンpatternに合致する部分を探します。
合致する部分が見つかったときには、文字列の先頭が1として、その部分の先頭、最後の位置の2つの数値を戻り値として返します。
合致する部分が見つからないときにはnilを返します。
pattern文字列型または正規表現オブジェクトまた、patternがキャプチャを持っている場合には、キャプチャされた文字列は、位置を表す2つの数値に続く戻り値として返されます。
init数値型(FIXNUM)3つ目の引数initを指定した場合には、パターンpatternを探し始める場所を先頭ではなく、init文字目から始めることができます。
initには負の数も指定でき、その場合は末尾から何文字目、という形になります。
plain論理型4つめの引数plainにtrueを指定した場合には、patternはパターンではなく単なる文字列であると解釈されます。
したがって、patternに単純に一致する部分を探すようになります。
s = "hello world"
  i, j = string.find(s, "hello")
  print(i, j)                         ---> 1, 5
  s.sub(1,5)                          ---> "hello"
  a, b = string.find("ABCDE", "BC")        -- a=2, b=3
  a, b = string.find("ABCDE", "%a*")       -- a=1, b=5
  a, b = string.find("ABCDE", /\a*/)       -- a=1, b=5
  a, b = string.find("あいうえお", "いう")   -- a=3, b=6
  a, b, c = string.find("ABCDE", "B(.)D")  -- a=2, b=4, c="C"

string.gsub(str, pattern, repl, n)

str文字列型文字列strに対して、パターンpatternに合致する部分をすべて引数replの指示通りに置き換えた新しい文字列と、patternが見つかった数を返します。文字列strは一切変更されません。
pattern文字列型または正規表現オブジェクト
repl文字列型、テーブル型、関数型のいずれかreplがテーブル型の場合、pattern中の最初のキャプチャをキーとするreplの要素の値が置き換え文字列となります。patternがキャプチャを含まない場合、patternに合致する部分全体がキーとなります。
replが関数型の場合、pattern中のすべてのキャプチャを引数としてreplが呼び出され、その戻り値が置き換え文字列となります。patternがキャプチャを含まない場合、patternに合致する部分全体が引数となります。
replがテーブル型もしくは関数型の場合、テーブルの要素の値もしくは関数の戻り値が文字列型であれば、それがそのまま置き換え文字列となります。数値型(FIXNUM)の場合は、文字列に変換したものが置き換え文字列になります。
テーブルの要素の値もしくは関数の戻り値がfalseあるいはnilの場合には、置き換えは実行されず、元の文字列がそのまま残ります。他の値になった場合には、エラーです。
n数値型(FIXNUM)4番目の引数nを指定した場合には、置き換えは最初のn個だけ実行されます。
省略した場合は、見つかった置き換えはすべて実行されます。
replが文字列型の場合、replそのものが置き換え文字列となります。replの中の以下の文字列は特別な意味を持ちます。
%0
 patternに合致する部分全体を表わす。
%1~%9
 patternの中の、指定した順番のキャプチャに合致する文字列を表わす。
%%
 パーセント文字そのものを表わす。
  x, y = string.gsub("HELLO world", /o/i, "o")
  -- x = "HELLo world", y = 2

  x, y = string.gsub("hello world", "(%w+)", "%1 %1")
  -- x = "hello hello world world", y = 2

  x, y = string.gsub("hello world from Lua", /(\w+)\s*(\w+)/, "%2 %1")
  -- x = "world hello Lua from", y = 2

  t = { name = "lua", version = "5.1" }
  x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
  -- x = "lua-5.1.tar.gz"

  function f(s)
    if s == "hello" then
      return "bye"
    elseif s == "world" then
      return "universe"
    else
      return "unknown"
    end
  end
  x = string.gsub("hello world", "(%w+)", f) -- x = "bye universe"

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS