正規表現を使用してマクロの機能を削除する

正規表現を使用してマクロの機能を削除する

\textbfファイル内のすべてを検索.texし、引数の中括弧とともに削除したいと思います{}。たとえば、次のように変更します。

  1. \textbf{text}text

  2. \textbf{text \textit{textbis}}text \textit{textbis}

  3. \textbf{\textit{\textls[-5]{textbis}} text}\textit{\textls[-5]{textbis}} text

  4. \textbf{\textit{X{textbis}} text}\textit{X{textbis}} textX段落区切りはここ)まで。

\\textbf\{([^}]*)\}使用してみました\1が、最初は止まってしまい動作しませんでした}

答え1

@David Carlisleがすでに述べたように、任意適切にネストされた{ }ペアの数。ただし、実用的な観点から、最大ネスト レベルの上限がわかっている場合があります。この上限がわかっている場合は、最大ネスト レベルまでの適切に括弧で囲まれた式を認識する正規表現を記述できます。

\texbf{normal text}(最大ネスト = 1)を認識するには次のようにします。

\textbf{([^{}]*)}

{括弧内の禁止は、ネスト レベルの最大値を超えるものと一致しないようにするための予防策です。

最大ネスト = 2 のものを一致させるには、次の操作を実行します。

  1. まずマッチする\\textbf\{
  2. 括弧以外の文字にマッチする[^{}]*
  3. これで内容の一致が終わり(実際のネストレベルは1)、最後に一致すれば完了です。\}
  4. または、開き括弧のある位置にいる可能性があります。この場合、ネスト レベル 0 の何かを一致させてから、閉じ括弧を一致させる必要があります。

ステップ2、3、4は繰り返して、[^{}]*(\{[^{}]*\}[^{}]*)?次のようなものを一致させることができます。\textbf{bla\bla{bla}bla\bla{bla}bla}

つまり、最大ネストレベル = 2 の正規表現は次のようになります。

\\textbf\{(([^{}]*(\{[^{}]*\}[^{}]*)?)*)\}

最大ネスト = N が 2 より大きい場合のスキームを推定できます。

\\textbf\{(([^{}]*(\{RN\}[^{}]*)?)*)\}

どこ

R1 = [^{}]*
RN = ([^{}]*(\{R(N-1)\}[^{}]*)?)*

例えば、最大ネストが3の場合、

\\textbf\{(([^{}]*(\{(([^{}]*(\{[^{}]*\}[^{}]*)?)*)\}[^{}]*)?)*)\}

これは、質問で言及されているすべてのケースを捕捉するのに十分です。

答え2

貪欲でない量指定子を使用できる場合、

\\textbf\{(.*?)\}と置換する\1

はい、Werner が述べたように、これはネストされていないコマンドでのみ機能します。これには簡単な解決策はなく、パーサーの仕事だと思います。

とにかく Regex で実行したい場合は、括弧以外の部分を\textbf未使用の記号に置き換え、最後に\textbf括弧を削除して記号を括弧に戻します。

1) 括弧以外の閉じ\textbf括弧をすべて}記号Aに置き換えます。

2)\textbf括弧以外のすべての開始部分を{記号Bに置き換えます。

3) 残り\textbf{の と}( から\textbf) を何もないものに置き換えます。

4) シンボル A を に{、シンボル B を}


@ステップ 1 と 2 に置き換えます。

ステップ 1: }-> Smybol A、私の例ではドイツ語ö:

(?<=(?<!\\textbf)\{(?!.*?\{)).*?\}

この式を\1ö(この式に対するより良い解決策は見つかりませんでした) に置き換えます


。次に、ステップ2を実行します。- {>シンボルB、私の例ではドイツ語ä

(?<!\\textbf)\{(?!.*?\{)

この式を に置き換えますä


ネストされたレベルの数だけこれらの手順を繰り返します。その後、残りの手順に従います。


まあ、これは堅牢な正規表現というよりは正規表現マクロと回避策ですが、機能するはずです。

関連情報