文字列として表される 2D マトリックスでパターンを検索しようとしています。以下を想像してください。
// horizontal line
String pat1 =
"............." +
"............." +
"............." +
"....XXXX....." +
"............." +
".............";
// vertical line
String pat2 =
"............." +
"......X......" +
"......X......" +
"......X......" +
"......X......" +
".............";
最初のパターンを検索するのは簡単です。正規表現は次のようになります。
X+
2 番目のケースでは、行列の列と行の数がわかっているため、少しトリッキーですが実行可能です。
(X.{`WIDTH - 1`})+
次のパターンを認識する方法を見つけようとしているときに、正しい正規表現を思いつくのに問題が発生しました。
// fixed but unknown number of columns
String pat3 =
"............." +
".....XXX....." +
".....XXX....." +
".....XXX....." +
".....XXX....." +
".............";
// variable number of columns
String pat4 =
"............." +
".....XXX....." +
"....XXXXX...." +
"...XXXXXXX..." +
".....XXX....." +
".............";
私が探しているのは、次の正規表現パターンを作成する方法です。
(X.{`WIDTH - PREVCOUNT`})+
最後に一致したパターンの長さはどこですかPREVCOUNT
(pat4 の 4 行目の最初の X が欠落していることは承知していますが、それで問題ありません)。正規表現に先読みがあることは知っていますが、私が達成しようとしていることがまったく可能かどうか疑問に思っています。可能だったとしても、先読みが内部でどのように機能するかを完全には理解していないため、先読みを使用することによるパフォーマンスへの影響についても心配しています。
単一の正規表現検証でこれを行う方法はありますか、または行ごとに検索してから、X がすべて連続しているかどうかを確認する必要がありますか?
編集:明確にするために、Xの「ブロブ」を検索しようとしています。列/行全体で連続した X がある限り、ブロブに属していると見なすことができます。いくつかの例:
String blob1 =
"............." +
"......XX....." +
"....XXXX....." +
"...XXXXX....." +
".....XXX....." +
".............";
String blob2 =
"............." +
".....XXX....." +
"....XXXXX....." +
"...XXXXXXX..." +
"....XXXXX...." +
".....XXX.....";
String blob3 =
"............." +
".....XXX....." +
".....XXX......" +
".....XXX....." +
"............." +
".............";
String notblob =
"............." +
"..XXX........" +
"......XXX....." +
"..XXX........." +
".............." +
".............";
私の解決策は正確である必要はないため、おそらくお粗末な正規表現アプローチを使用しようとしています。