ルックビハインドは、この種の問題について誰もが最初に考えることですが、無制限のルックビハインドをサポートする.NETのようなフレーバーであっても、間違ったツールです。何かをハックすることはできますが、.NETでも醜いものになります。より良い方法は次のとおりです。
`[^`\\]*(\\.[^`\\]*)*`
最初の部分は、開始区切り文字から始まり、区切り文字または円記号以外のものをすべて飲み込みます。次の文字が円記号の場合、それが何であれ、それとそれに続く文字を消費します。区切り文字、別の円記号、またはその他のものである可能性がありますが、問題ではありません。
これらの手順を必要な回数繰り返します。一致することも一致すること[^`\\]
も\\.
できない場合は、次の文字を終了区切り文字にする必要があります。または文字列の終わりですが、入力は整形式であると想定しています。ただし、整形式でない場合、この正規表現はすぐに失敗します。この他のアプローチのために、私は多くのことを目にします。
`(?:[^`\\]+|\\.)*`
これは整形式の入力では正常に機能しますが、サンプル入力から最後のバッククォートを削除するとどうなりますか?
"hello `how\` are you"
RegexBuddyによると、最初のバッククォートに遭遇した後、この正規表現は、失敗をあきらめて報告する前に、9,252の異なる操作(またはステップ)を実行しました。私は10ステップで失敗しました。
編集区切り文字内のパーだけを抽出するには、その部分をキャプチャグループでラップします。それでも、バックスラッシュを手動で削除する必要があります。
`([^`\\]*(?:\\.[^`\\]*)*)`
また、他のグループを非キャプチャに変更しました。これは最初から行う必要がありました。私は宗教的にキャプチャすることを避けませんが、ものをキャプチャするためにそれらを使用している場合、使用する他のグループはキャプチャしない必要があります。
編集私は質問を読みすぎていると思います。StackOverflowでは、インラインコードセグメントまたはコメントにリテラルバックティックを含める場合は、区切り文字として1つだけでなく、3つのバックティックを使用します。バックティックをエスケープする必要がないため、バックスラッシュも無視できます。あなたの正規表現はこれと同じくらい単純であることが判明するかもしれません:
```(.*?)```
誤った区切り文字の可能性に対処するには、同じ基本的な手法を使用します。
```([^`]*(?:`(?!``)[^`]*)*)```
これはあなたが求めているものですか?
ちなみに、この答えは上記の@nneonneoのコメントと矛盾しません。この回答は、試合が行われている状況を考慮していません。プログラムやウェブページのソースコードに含まれていますか?そうである場合、一致はコメントまたは文字列リテラル内で発生しましたか?最初に見つけたバッククォートがエスケープされなかったことをどうやって知ることができますか?正規表現は、それらが動作するコンテキストについて何も知りません。それがパーサーの目的です。