SomeeLab.tools

正規表現テスター

正規表現を自分の文字列に当てて試せます。一致した箇所を色分けし、キャプチャグループと置換結果もあわせて表示します。別スレッドで動かすので、パターンが暴走しても画面は固まりません。

4つのフラグの働き

gを外すと最初の一致だけを探します。件数を数えるときや全部置き換えるときは入れてください。

iは大文字小文字を区別しません。m^$を文字列全体ではなく行ごとに効かせます。複数行のログから行頭を拾うときに使います。

s.が改行にも一致するようにします。.は既定で改行を含まないので、複数行にまたがるかたまりを丸ごと取るにはこのフラグが要ります。

覚えておくと早い部品

  • \dは数字、\wは英数字とアンダースコア、\sは空白類。大文字にすると(\D \W \S)逆の意味になります。
  • +は1個以上、*は0個でも可、?はあってもなくても、{2,4}は2回から4回。
  • ^は先頭、$は末尾、\bは単語の境目です。
  • (...)はキャプチャグループで結果に残り、(?:...)はまとめるだけです。
  • (?<name>...)と名前を付けると、番号ではなく名前で取り出せます。

貪欲な量指定子と控えめな量指定子

.*は行けるところまで進んでから後戻りします。<b>ひとつ</b><b>ふたつ</b><b>.*</b>を当てると、全体がひとつの一致になってしまいます。

?を足して<b>.*?</b>にすると、できるだけ短いところで止まるので2件に分かれます。タグや引用符の中身を取り出すときは、たいていこちらが正解です。

なぜ別スレッドで動かすのか

量指定子が入れ子になると、正規表現が暴走することがあります。(a+)+baを30個ほど与えた場合がそれです。エンジンがaの分け方をすべて試すので、手間が桁違いに膨らみます。短い入力なのに何分もかかります。

このツールは正規表現を画面とは別のスレッドで動かし、1秒を超えたらそのスレッドごと終了させます。ひとつの呼び出しの中で起きることなので、途中で止める手立てがないからです。おかげで暴走するパターンを入れても画面は動いたままです。

同じことがサーバーで起きるとリクエストがCPUを占有します。利用者の入力が正規表現に渡るコードでは、量指定子の入れ子を特に確かめてください。

言語によって書き方が違います

ここで動くのはJavaScriptの正規表現です。後読み((?<=...))は今のブラウザで使えますが、再帰やアトミックグループのようなPCRE独自の機能はありません。

Pythonは名前付きグループを(?P<name>...)と書き、Javaは文字列の中でバックスラッシュをもう一度重ねる必要があります。ここで仕上げたパターンを移すときは、その言語の書き方に直してください。