トップページに戻る    次の正規表現パズルへ    前の正規表現パズルへ

9-10 括弧問題(平衡グループ)

正規表現パズル

行頭直後の開き括弧から、対応する閉じ括弧まで中身を含めて検索する。
括弧のネストは許可する。

擬似括弧として開き括弧をS、閉じ括弧をEとする。

詳説正規表現2版の423ページ
詳説正規表現3版の431ページ
を参考にさせていただきました。

7-9 行頭にある最初の擬似括弧の中身を検索の.NETで平衡グループを使う解です。

MSDN --- グループ定義の均等化


対象データ

S 1+2+3 E
S 1+2+S 3+4 E*5 E+1+2
S 1+2+S 3+4 E*5 E+S 1+2 E*3
S S S 1+2 E *2 E*3 E+ S1+2 E
1+2+S 1*5 E
S S E S E E
S S S E E S E E


ソース

using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string[] strArr = {"S 1+2+3 E",
                           "S 1+2+S 3+4 E*5 E+1+2",
                           "S 1+2+S 3+4 E*5 E+S 1+2 E*3",
                           "S S S 1+2 E *2 E*3 E+ S1+2 E",
                           "1+2+S 1*5 E",
                           "S S E S E E",
                           "S S S E E S E E"};

        const string Pattern = @"^S"
                             + @"([^SE]|S(?<depth>)|E(?<-depth>))*"
                             + @"(?(depth)(?!))E";

        System.Console.WriteLine("Pattern {0}", Pattern);
        foreach (string each in strArr) {
            string WillOut = each;
            if (Regex.IsMatch(each, Pattern)) {
                WillOut += " matchs ";
                WillOut += Regex.Match(each, Pattern).Value;
            }
            else {
                WillOut += " no match";
            }
            System.Console.WriteLine(WillOut);
        }
    }
}


実行結果

Pattern ^S([^SE]|S(?<depth>)|E(?<-depth>))*(?(depth)(?!))E
S 1+2+3 E matchs S 1+2+3 E
S 1+2+S 3+4 E*5 E+1+2 matchs S 1+2+S 3+4 E*5 E
S 1+2+S 3+4 E*5 E+S 1+2 E*3 matchs S 1+2+S 3+4 E*5 E
S S S 1+2 E *2 E*3 E+ S1+2 E matchs S S S 1+2 E *2 E*3 E
1+2+S 1*5 E no match
S S E S E E matchs S S E S E E
S S S E E S E E matchs S S S E E S E E


解説

詳説正規表現のサンプルを、ループ展開を使わない形に変形してます。
depthという名前付きキャプチャで擬似括弧のネストの深さを管理してます。