このPCRE正規表現を試してみてください。
(?<!\\) # negative look-behind to make sure start is not escaped
(?: # start non-capture group for all possible match starts
# group 1, match dollar signs only
# single or double dollar sign enforced by look-arounds
((?<!\$)\${1,2}(?!\$))|
# group 2, match escaped parenthesis
(\\\()|
# group 3, match escaped bracket
(\\\[)|
# group 4, match begin equation
(\\begin\{equation\})
)
# if group 1 was start
(?(1)
# non greedy match everything in between
# group 1 matches do not support recursion
(.*?)(?<!\\)
# match ending double or single dollar signs
(?<!\$)\1(?!\$)|
# else
(?:
# greedily and recursively match everything in between
# groups 2, 3 and 4 support recursion
(.*(?R)?.*)(?<!\\)
(?:
# if group 2 was start, escaped parenthesis is end
(?(2)\\\)|
# if group 3 was start, escaped bracket is end
(?(3)\\\]|
# else group 4 was start, match end equation
\\end\{equation\}
)
))))
はアクションでこの正規表現を参照してください:https://regex101.com/r/wP2aV6/25
この正規表現は、再帰を使用しているので、それが正しくネストされた数式を処理します。
これはPCRE互換の正規表現エンジンでのみ機能します。それは、すべての正規表現エンジンには存在しない負のlookbehind、条件式、および再帰のような正規表現エンジンのいくつかの高度な機能を必要とします。
質問を編集すると、回答とコメントが消えたのはなぜですか? – marczellm
Oliはあなたの批評に答えて彼の答えを削除しましたので、もう見えません。しかし、あなたのコメントには次のような言葉があります: '\(... \)' *はネストすることができます( '\(x = y + z \ text {ここで\(z \)はエラーです} \)有効)。これが '$ ... $'を好む理由の一つです。ただし、簡単にするために無視することもできます。 –
@KonradRudolphはい、それは重要ではありません。 – marczellm