【GO】正規表現の複数行マッチ


Golangの正規表現は少し癖が強いような気がします。

複数行の抜き出しで戸惑ったので基本からおさらい。

ドキュメント:https://golang.org/pkg/regexp/

正規表現:https://github.com/google/re2/wiki/Syntax

ざっくりと関数説明

まずは正規表現を作ります。

  • Compile
  • CompilePOSIX
  • MustCompile
  • MustCompilePOSIX

Mustがつくと返値のerrorがなくなり、パース失敗時にpanicします。

POSIXがつくとUNIX共通正規表現でコンパイルされます。

 

正規表現を作った後はマッチを行います。

  • Find系(マッチしたものを抜き出す)
    • Allがつく(全てのマッチを返す)
    • Indexがつく(インデックスを返す)
    • Submatchがつく(マッチしたものと、サブマッチを返す)
  • Match系(マッチするかどうか返す:bool)
  • Replace系(マッチしたものを置き換える)
  • その他

大まかにこんな感じです。

関数サンプル

ベースとしてこんな感じで確かめました。

Submatch

()でグルーピングされたサブマッチも返します。

通常の任意文字.や文字セットなどは検知しません。

改行を含むマッチ

(.*)でマッチさせるとき、改行を含んでマッチさせるにはsフラグを立てます。

sフラグを立てない場合に(.*)が行内のマッチしかしていないことがわかります。

 

改行に関するものとしてmフラグもあります。

行頭^、行末$を行ごとに判定するためのフラグです。

全体ではghiが最後なので1つ目はnilですが、行ごとに見ると2つマッチします。

 

ついでに残りのフラグi(大小文字区別なし),U(ものぐさ)はこんな感じです。

ものぐさは常に最短マッチを行うフラグです。

2つ目の例はsフラグで改行を含んだマッチが可能ですが、Uフラグで(.*)(.*?)と解釈されるため短いマッチabcが2つの結果になります。

 

POSIX

詳しい挙動の違いは判りませんがサブマッチの振る舞いが違いました。

通常だと左側優先、POSIXだと最長優先しているようです。


コメントを残す

メールアドレスが公開されることはありません。