コメントは HTML でネストできないため、理論的には正規表現がその役割を果たします。それでも、特に入力が適切な形式であることが保証されていない場合は、ある種のパーサーを使用することをお勧めします。
これが私の試みです。通常のコメントのみに一致させるには、これでうまくいきます。かなりのモンスターになってしまいました、すみません。かなり広範囲にテストしましたが、うまくいくようですが、保証はしません。
<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->
説明:
<!-- #01: "<!--"
(?! #02: look-ahead: a position not followed by:
\s* #03: any number of space
(?: #04: non-capturing group, any of:
\[if [^\]]+] #05: "[if ...]"
|<! #06: or "<!"
|> #07: or ">"
) #08: end non-capturing group
) #09: end look-ahead
(?: #10: non-capturing group:
(?!-->) #11: a position not followed by "-->"
. #12: eat the following char, it's part of the comment
)* #13: end non-capturing group, repeat
--> #14: "-->"
ステップ 02 と 11 は非常に重要です。#02 は、以下の文字が条件付きコメントを示していないことを確認します。その後、#11 は次の文字がコメントの終わりを示していないことを確認し、#12 と #13 は実際の一致を引き起こします。
「global」および「dotall」フラグを使用して適用します。
反対のことを行う (条件付きコメントのみに一致する) には、次のようになります。
<!(--)?(?=\[)(?:(?!<!\[endif\]\1>).)*<!\[endif\]\1>
説明:
<! #01: "<!"
(--)? #02: two dashes, optional
(?=\[) #03: a position followed by "["
(?: #04: non-capturing group:
(?! #05: a position not followed by
<!\[endif\]\1> #06: "<![endif]>" or "<![endif]-->" (depends on #02)
) #07: end of look-ahead
. #08: eat the following char, it's part of the comment
)* #09: end of non-capturing group, repeat
<!\[endif\]\1> #10: "<![endif]>" or "<![endif]-->" (depends on #02)
ここでも、「global」フラグと「dotall」フラグを使用して適用します。
ステップ #02 は、「downlevel-revealed」構文によるものです。「MSDN - 条件付きコメントについて」を参照してください。
スペースが許可または期待される場所が完全にはわかりません。必要に応じて式に追加\s*
します。