$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) --> でも解決できます。