$INEST(start match, [inner match,] end match)
$INESTはやや解りづらいマッチングコマンドなので、$NESTと比較しながら解説します。
htmlソース<!-- ad start 1 -->
...<!-- ad start 2 -->
...<!-- ad start 3 -->
...<!-- ad end 3 -->
...<!-- ad end 2 -->
...<!-- ad end 1 -->
上のhtmlソースで各組み合わせを意識した表現を考えます。
ここで$NESTを使ってみましょう。
[Patterns] Name = "$NEST" Active = TRUE Limit = 256 Match = "$NEST(<!-- ad\sstart\s([0-9]+)\0 -->,<!-- ad\send\s$TST(\0) -->)" Replace = "Replaced"
上のフィルタでは
にマッチしてしまいますね。<!-- ad start 3 -->
... <!-- ad end 3 -->
この場合の$NESTは一番初めにマッチした表現を優先するようです。
次に、$INESTを使ってみましょう。
[Patterns] Name = "$INEST" Active = TRUE Limit = 256 Match = "<!-- ad\sstart\s([0-9]+)\0 -->" "$INEST(<!-- ad\sstart\s$TST(\0) -->,<!-- ad\send\s$TST(\0) -->)" "<!-- ad\send\s[0-9]+ -->" Replace = "Replaced"
今度は
にマッチしてくれました。<!-- ad start 1 -->
... <!-- ad end 1 -->
このように、$INESTは「発見済みの開始タグ」と組み合わさる終了タグを見つけることを優先します。
この場合の、発見済みの開始タグとは <!-- ad start 1 -->
を指し、それと組み合わさる <!-- ad end 1 -->
を見つける事を優先したわけです。
$INESTは "Inner Nest" の略です。
この事からもわかるように、$INESTは開始タグと終了タグの 内部(Inner) を消費します。
ですので、上のフィルタでは$INESTの外に開始タグと終了タグを1つずつ置いて消費させています。
# 今回のように$NESTで困る状況は、終了タグにユニークな文字列が入る場合に限ります。
$NEST(<div class=$AV(ad[0-9]+),</div>)
のように終了タグがユニークでない場合は、$NESTは一番外側の組み合わせにマッチします。
# 今回の例題は、<!-- ad\sstart\s([0-9]+)\0 -->*<!-- ad\send\s$TST(\0) -->
でも解決できます。