正規表現の利用について

SSTP Bottle Clientでは、スクリプト中の本文の検索・置換などに正規表現を利用できます。

正規表現は文字列のパターンを記述するための言語で、非常に柔軟にスクリプトに含まれる文字列の中身を評価できる方法です。

謝辞

実装にはBREGEXP DLLを利用させて頂いています。

正規表現で検索を行う

正規表現では、基本的には文字列のパターンをそのまま表記します。

"3a" というパターンは、"123abc" "333aaa" という文字列にマッチします。

ただし、記号の中には特殊な意味を持っているものがあります(注意:以下の説明では、ボトルでの利用を考慮し、単一行の文字列に対する検索のみについて説明します)。

先頭と終端

文字列の先頭と終端は、それぞれ "^""$" で表します。

"^3a" というパターンは、"123abc" にはマッチせず、"3abc" にはマッチします。

"^3a$" というパターンは、"3a" という文字列にのみマッチし、他の文字列には一切マッチしません。

グループ化と選択・列挙

"()" でパターンを囲むとグループ化され、また "|" でパターンの選択(or)を行うことができます。

"b(o|a)ttle" というパターンは、"bottle""battle" にマッチします。

"(SSTP|Pet) Bottle" というパターンは、"SSTP Bottle" "Pet Bottle" を含む文字列にマッチします。

文字クラス

"[]" で囲んだ中に文字を入れると、その中のどれか1文字、という意味になります。"-" で範囲による指定が可能です。"^" が文字クラスの中で先頭にあると、否定の意味(それ以外のどれか1文字)になります。

"^[1-6]-[A-D]$" というパターンは、"1-A","3-B","6-D" といった文字列にマッチします。

"[^A-Za-z0-9]" というパターンは、アルファベットや数字「以外」の何か1文字にマッチします。

メタ文字

文字クラスによらず、様々な「文字の集合のどれか」を意味する書き方があります。

\w 単語」の構成文字 (英数字と "_") にマッチ
\W 単語の構成文字以外にマッチ
\s 空白文字にマッチ
\S 空白文字以外にマッチ
\d 数字にマッチ
\D 数字以外にマッチ
\b 単語の境界にマッチ
\B 単語の境界以外にマッチ
\A 文字列の最初にのみマッチ
\Z 文字列の最後にのみマッチ
. 任意の1文字にマッチ(ピリオド)

数量子

"*" は直前の文字かパターンの0回以上の繰り返しを表します。

"Goo*d" というパターンは、"Good", "God", "Gooood" などにマッチします。

"+" は直前の文字かパターンの1回以上の繰り返しを表します。

"Goo+d" というパターンは、"Good", "Gooood" にマッチし、"God"にマッチしません。

"?" は直前の文字かパターンの0回または1回の登場にマッチします。

"Goo?d" というパターンは、"Good""God" にマッチします。

より汎用的に、"{2,5}" (2回以上5回以下)、 "{,10}" (0回以上10回以下)、 "{5}" (ちょうど5回)、"{3,}" (3回以上) という書き方もできます。

"Go{1,2}d" というパターンは "Goo?d", "(Good|God)" というパターンと等価です。

最短マッチ

数量子 "+""*" の後に "?" を付けると、その繰り返しについて出来るだけ短いマッチングを選ぼうとする「最短マッチ」になります。

"<.+>""<br><br>" の全体にマッチしますが、"<.+?>""<br><br>" の、最初の "<br>" にのみマッチします。(この違いはマッチの結果を基にして置換を行う際に重要)

エスケープ

記号そのものをパターンとして記入する時には、"\" でクォートします。

"c\:\\""c:\" に、"a\[b\]""a[b]" にマッチします。

組み合わせる

以上を組み合わせることで、非常に強力な検索が行えます。

"^\d{3}-\d{4}$" は7桁の郵便番号にマッチします。

"^(\d+\.)+\d+[a-z]?$" は、"3.14a", "0.2.5", "8.3.9.0b" などのバージョン文字列にマッチします。

"[^\\](\\s\d|\\s\[\d+\]|\\s\[-1\])" は、 "\s2", "\s[200]", "\s[-1]" といったサーフィス切替えタグにマッチし、"\\s[4]" のようにエスケープされているものを、「ほぼ」無視します。ただし、"あ\\\s[4]" といった文字列(タグが含まれています)にもマッチしなくなりますので注意してください。

正規表現で置換を行う

「置換」の場合、置換先の文字列に、"\1""\9" までの特殊なメタ文字が使えます。これは、置換前パターンで利用したグループにマッチした文字列に、自動的に置き換わります。"\1""\9" の代わりに、"$1""$9" も使えます。

"([ぁ-ぉっ])""\1\1\1" に置き換えると、"あぁっ""あぁぁぁっっっ" になります。

"^((\w+)-(\w+))$""\1 => \3! \2!" に置き換えると、"After-Before""After-Before => Before! After!" になります。

この特殊なメタ文字を駆使することで、非常に柔軟な置換が行えますので是非活用してください。