特定の単語間の特定の文字を置き換えるにはどうすればいいですか?

特定の単語間の特定の文字を置き換えるにはどうすればいいですか?

Notepad++ の検索/置換機能を使用して、特定の単語間の特定の文字を置換する方法を教えてください。以下の例を参照してください。単語「START」と「END」の間にあるすべてのハイフンを検索し、スペースに置換します。ドキュメント内の他のハイフンは置換されません。

私はグーグルで検索した正規表現の例を使用してこれを解決しようとしましたが、残念ながらこれまでのところ成功していません。

私が持っているものは次のとおりです:

START-Hyphens-should-be-replaced-here-01-END
OTHER-no-changes-here-02-WORD
START-Hyphens-should-also-be-replaced-here-03-END
OTHER-no-changes-here-either-04-TEXT

私が欲しいものは次のとおりです:

START Hyphens should be replaced here 01 END
OTHER-no-changes-here-02-WORD
START Hyphens should also be replaced here 03 END
OTHER-no-changes-here-either-04-TEXT

答え1

正規表現を完全に放棄することをお勧めします。このようなケースでは、正規表現を動作させるのが面倒すぎるからです。正規表現ですべてが簡単に解決できるわけではありません。この場合、ほとんどのスクリプト言語でかなり簡単に解決できます。JavaScript を少し書きました。ここ- 区切り文字と入力内容を入力して、「送信」をクリックするだけです。

説明としては、開始区切り文字で分割し、各「ブロック」を終了区切り文字で分割します。開始と終了の間にあるテキスト ブロックが作成され、そのブロックに対して置換が実行されます。次に、分割されたブロックを結合し直します。これは最も効率的な方法ではありませんが、個々の文字を処理するよりも少し簡単です。

xkcd - Perl の問題


古くて部分的に機能する正規表現の解決策は以下にあります。重く使用しないことをお勧めします。

簡単な答え:Notepad++ではなく、これJS スニペット (右下にテキストを入力して送信をクリックします)。必要に応じて、左下のスクリプトの とSTARTを置き換えます。END

あるいは、Windows (Vista+) ネイティブの PowerShell を使用することもできます。

Get-Content input.txt | %{ $_ -replace "(?<=START.*?)-(?=.*?END)", " " } | Out-File output.txt

input.txtおよび を適宜置き換えますoutput.txt。注意: これらは異なるファイルである必要があります。

この特定のソリューションは、次の場合にのみバグなしで動作します。1つSTART1行あたりの出現回数そして 1つEND1行あたりの出現回数そして行をまたがらないため、各行を個別に処理できます。


1行に1つの一致のみが必要であり、各一致が1行内に含まれることが保証されている場合、(?<=START.*?)-(?=.*?END)1つのスペースに一致させて置換すると機能します。を除外するNotepad++ はこの特定のパターンを好まないようです。後読みと先読み (完全な PCRE のようです) をサポートしていますが、これに関して何か問題があります。

ヨハネスがすでに回答しているのと似た代替案としては、単純なパターンを使用する方法があります。(START.*?)-(.*?END)これを に置き換えます\1 \2。ここでの問題は、これは次のものにしか一致しないということです。1つ一度に 1 行に 1 つのハイフンを挿入します。これはすぐに面倒になります。

ここでは、より完全なスクリプト言語の使用を試みます。JavaScriptは良い代替手段です。しかし、しない後読みをサポートします。プラス面としては、ループで実行できるので、以前の面倒な解決策が実際に実行可能になります。例を作成しました。ここ

答え2

適切な正規表現は です。(START[^\-]*)-(.*END)これを に置き換えて\1 \2、「すべて置換」を複数回使用します (クリックごとに各行で 1 つだけが置換されます)。

関連情報